将R中的多个二进制列合并到一个保留位置的列中

时间:2017-04-04 11:59:49

标签: r dataframe merge multiple-columns

我在R中有一个包含30列的数据框,其中包含二进制数据。每行只包含一个1.换句话说,二进制值是互斥的。对于所有三十列,没有两列可以在同一行中包含1。以下是我的意思。

1
2
3
1
3

现在显然,将这​​些信息分布在30列以上,计算上非常昂贵。我想要做的是将所有这30列合并到一个包含30个不同因子变量的列中。例如,新列在每行中包含2s,其中第二列具有1,在第三列具有1的每一行中包含3,等等。保留原始订单并且在它们行为时不会弄乱位置是很重要的。作为其他列的索引。所以上面的3列将成为这个:

{{1}}

我如何在R?

中实现这一目标

非常感谢

2 个答案:

答案 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
}