R,将列与行相关联

时间:2015-10-10 12:58:54

标签: r data-analysis

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

can1 can2 can3 can4 can5

,每列都有二进制数据(TRUE或FALSE),我有另一列-CANDIDATES,其数据集合的名称为5个候选者(因子= 5)(相同的候选者)。 所以它就像

can1 can2 can3 can4 can5 CANDIDATES

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

示例:

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

您还可以使用简单的mapply

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

基本上对于每一行(x参数),返回相应的候选列(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