R,将列与行相关联

R, relating columns to row

我有五列[每列名称代表每个候选人说..

can1 can2 can3 can4 can5

,每列都有二进制数据(TRUE 或 FALSE),我还有另一列 CANDIDATES,其中包含包含 5 个候选人(因子 = 5)(相同候选人)姓名的数据集合。 所以它类似于

can1 can2 can3 can4 can5 CANDIDATES

我想创建一个二元列,如果 CANDIDATE 的元素和相应的候选列(在第 5 列中)为真,则该行为真。否则它必须为假。

示例:

can1 can2  can3   can4   can5    CANDIDATES   new_colmn

TRUE TRUE  FASLE  TRUE   FALSE   can2          TRUE
FALSE TRUE FALSE FALSE   FALSE   can4          FALSE
FALSE TRUE TRUE  FALSE   FALSE   can2          TRUE
TRUE TRUE  FALSE FALSE   TRUE    can1          TRUE

我们可以使用矩阵索引来创建新列:

df$new_column <- df[-ncol(df)][cbind(1:nrow(df), match(df$CANDIDATES, names(df)))]

说明

函数调用 match(df$CANDIDATES, names(df) 是一种将 CANDIDATES 列与其他列名称匹配的方法。而 1:nrow(df) 只是输出一个从 1 到最后一行数字的序列。我们一起得到:

cbind(1:nrow(df), match(df$CANDIDATES, names(df)))
     [,1] [,2]
[1,]    1    2
[2,]    2    4
[3,]    3    2
[4,]    4    1

这是一系列的行、列组合。 R 的一个优势是能够使用两列矩阵对数据框进行子集化。第一列将表示行索引,第二列表示列索引。

矩阵子集将强制转换为矩阵,如果我们的输入都是同一类型,那也没关系。这就是为什么我们将数据框子集化为仅逻辑列 df[-ncol(df)]。这样就不会发生类型转换。

结果:

df
   can1 can2  can3  can4  can5 CANDIDATES new_column
1  TRUE TRUE FASLE  TRUE FALSE       can2       TRUE
2 FALSE TRUE FALSE FALSE FALSE       can4      FALSE
3 FALSE TRUE  TRUE FALSE FALSE       can2       TRUE
4  TRUE TRUE FALSE FALSE  TRUE       can1       TRUE

您也可以为此使用一个简单的 mapply

df$new_colmn <- 
mapply(function(x,y) {
  df[x,y]
  },
  1:nrow(df),     #row number
  df$CANDIDATES)  #corresponding candidates column

基本上,对于每一行(x 参数),您 return 相应的候选列(y 参数)。

输出:

> df
   can1 can2  can3  can4  can5 CANDIDATES new_colmn
1  TRUE TRUE FALSE  TRUE FALSE       can2      TRUE
2 FALSE TRUE FALSE FALSE FALSE       can4     FALSE
3 FALSE TRUE  TRUE FALSE FALSE       can2      TRUE
4  TRUE TRUE FALSE FALSE  TRUE       can1      TRUE