我有五列[每列名称代表每个候选人说..
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
答案 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