关联其列名与 r 数据帧中每一行中两个变量的值匹配的向量
Correlate vectors whose colnames match the values of two variables in each row in r dataframe
我在 r (link) 中有这个数据框(下面的行和列示例)
FocalID Mother Adelaide Asimov Austen Brazzaville Lusaka Kinshasa
Adelaide HalfEar 0 0.0380 0.0417 0.0366 0.0278 0.0385
Asimov Lusaka 0.0380 0 0.0845 0.0357 0.169 0.0641
Austen Kinshasa 0.0417 0.0845 0 0.0526 0.0952 0.0411
Brazzaville NA 0.0366 0.0357 0.0526 0 0.0395 0.0488
我想添加一个新变量 df$cor,其中每一行的值都是相关的结果。相关性应该在两个向量之间:(1) colname 对应于该行中变量 df$FocalID 值的列,以及 (2) colname 对应于该行中变量 df$Mother 值的列.
如果对应于与母亲姓名匹配的列的向量不存在(因为母亲未知(df$Mother 中的 NA)或 colnames 中不存在),相关性应该产生 NA。
我试过以下代码:
df$cor <- cor(df[, colnames(df) %in% df$FocalID], df[, colnames(df) %in% df$Mother])
不过,结果好像不太对。有什么想法吗?
如果我们需要对每个成对列执行此操作,我们会检查 'FocalID'、'Mother' 列是否为 complete.cases
的非 NA。然后,循环指定仅对非 NA 列进行子集化的列,使用 apply
和 MARGIN = 1
,检查这些元素是否是 %in%
数据集的列名,select 数据,应用 cor
并创建新列 Cor
i1 <- complete.cases(df[1:2])
df$Cor <- NA_real_
df$Cor[i1] <- apply(df[i1, 1:2], 1, function(x)
if(all(x %in% names(df))) cor(df[, x[1]], df[, x[2]]) else NA)
-输出
df$Cor
#[1] NA 0.09769710 0.26956397 NA 0.04820137 -0.07776837 NA 0.19553956 -0.09596063 NA 0.04806345
#[12] 0.66489746 NA NA NA -0.04254666 -0.05975570 0.47359966 0.09745244 NA NA 0.24750130
#[23] NA NA NA NA NA NA NA NA 0.10822526 NA 0.07093166
#[34] NA NA -0.18088278 -0.17548394 0.11585058 0.07278060 0.36327624 0.10178624 NA NA NA
#[45] 0.20491334 NA
或使用 dplyr
中的 rowwise
library(dplyr)
df <- df %>%
rowwise %>%
mutate(Cor = if(!is.na(FocalID) & !is.na(Mother) &
all(c(FocalID, Mother) %in% names(.)))
cor(df[[FocalID]], df[[Mother]]) else NA_real_)
数据
library(readxl)
df <- read_excel(file.choose(), na = "NA")
我在 r (link) 中有这个数据框(下面的行和列示例)
FocalID Mother Adelaide Asimov Austen Brazzaville Lusaka Kinshasa
Adelaide HalfEar 0 0.0380 0.0417 0.0366 0.0278 0.0385
Asimov Lusaka 0.0380 0 0.0845 0.0357 0.169 0.0641
Austen Kinshasa 0.0417 0.0845 0 0.0526 0.0952 0.0411
Brazzaville NA 0.0366 0.0357 0.0526 0 0.0395 0.0488
我想添加一个新变量 df$cor,其中每一行的值都是相关的结果。相关性应该在两个向量之间:(1) colname 对应于该行中变量 df$FocalID 值的列,以及 (2) colname 对应于该行中变量 df$Mother 值的列.
如果对应于与母亲姓名匹配的列的向量不存在(因为母亲未知(df$Mother 中的 NA)或 colnames 中不存在),相关性应该产生 NA。
我试过以下代码:
df$cor <- cor(df[, colnames(df) %in% df$FocalID], df[, colnames(df) %in% df$Mother])
不过,结果好像不太对。有什么想法吗?
如果我们需要对每个成对列执行此操作,我们会检查 'FocalID'、'Mother' 列是否为 complete.cases
的非 NA。然后,循环指定仅对非 NA 列进行子集化的列,使用 apply
和 MARGIN = 1
,检查这些元素是否是 %in%
数据集的列名,select 数据,应用 cor
并创建新列 Cor
i1 <- complete.cases(df[1:2])
df$Cor <- NA_real_
df$Cor[i1] <- apply(df[i1, 1:2], 1, function(x)
if(all(x %in% names(df))) cor(df[, x[1]], df[, x[2]]) else NA)
-输出
df$Cor
#[1] NA 0.09769710 0.26956397 NA 0.04820137 -0.07776837 NA 0.19553956 -0.09596063 NA 0.04806345
#[12] 0.66489746 NA NA NA -0.04254666 -0.05975570 0.47359966 0.09745244 NA NA 0.24750130
#[23] NA NA NA NA NA NA NA NA 0.10822526 NA 0.07093166
#[34] NA NA -0.18088278 -0.17548394 0.11585058 0.07278060 0.36327624 0.10178624 NA NA NA
#[45] 0.20491334 NA
或使用 dplyr
rowwise
library(dplyr)
df <- df %>%
rowwise %>%
mutate(Cor = if(!is.na(FocalID) & !is.na(Mother) &
all(c(FocalID, Mother) %in% names(.)))
cor(df[[FocalID]], df[[Mother]]) else NA_real_)
数据
library(readxl)
df <- read_excel(file.choose(), na = "NA")