我在R中有一个包含30列的数据框,其中包含二进制数据。每行只包含一个1.换句话说,二进制值是互斥的。对于所有三十列,没有两列可以在同一行中包含1。以下是我的意思。
1
2
3
1
3
现在显然,将这些信息分布在30列以上,计算上非常昂贵。我想要做的是将所有这30列合并到一个包含30个不同因子变量的列中。例如,新列在每行中包含2s,其中第二列具有1,在第三列具有1的每一行中包含3,等等。保留原始订单并且在它们行为时不会弄乱位置是很重要的。作为其他列的索引。所以上面的3列将成为这个:
{{1}}
我如何在R?
中实现这一目标非常感谢
答案 0 :(得分:3)
我们可以使用max.col
来查找数据集第一个值的索引
max.col(df1)
#[1] 1 2 3 1 3
或pmax
do.call(pmax, col(df1)*df1)
#[1] 1 2 3 1 3
df1 <- structure(list(v1 = c(1L, 0L, 0L, 1L, 0L), v2 = c(0L, 1L, 0L,
0L, 0L), v3 = c(0L, 0L, 1L, 0L, 1L)), .Names = c("v1", "v2",
"v3"), class = "data.frame", row.names = c(NA, -5L))
答案 1 :(得分:0)
谢谢大家。我也找到了解决方案。如果我的30个二进制行和500 000行的数据帧被称为df,我只需创建一个包含30个因子的向量并循环遍历这些因子:
factors = c(1:30)
newcol = rep(0, 500000)
for(f in factors){
colvalues=df[,f]
newcol[which(colvalues==1)]=f
}