关联其列名与 r 数据帧中每一行中两个变量的值匹配的向量 数据

问题描述

我在 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) 列名对应于该行中变量 df$FocalID 的值的列,以及 (2) 列名对应于该行中变量 df$Mother 的值的列.

如果与母亲姓名匹配的列对应的向量不存在(因为母亲未知(df$Mother 中的 NA)或列名中不存在),则相关性应产生 NA。

我尝试了以下代码

df$cor <- cor(df[,colnames(df) %in% df$FocalID],df[,colnames(df) %in% df$Mother])

然而,结果似乎不对。有什么想法吗?

解决方法

如果我们需要对每个成对列执行此操作,我们会使用 complete.cases 检查 'FocalID'、'Mother' 列是否为非 NA。然后,循环指定仅对非 NA 列进行子集化的列,使用 applyMARGIN = 1,检查这些元素是否是 %in% 数据集的列名,选择数据,应用 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

或者使用 rowwise 中的 dplyr

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")