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