【问题标题】:Merging multiple binary columns in R into one column preserving position将R中的多个二进制列合并到一个列保留位置
【发布时间】:2017-08-29 14:51:58
【问题描述】:

我有一个包含 R 中包含二进制数据的 30 列的数据框。每一行都包含一个 1。换句话说,二进制值是互斥的。对于所有 30 列,任何两列都不能在同一行中包含 1。这是我的意思的说明。

1  0  0
0  1  0 
0  0  1
1  0  0
0  0  1

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

1
2
3
1
3

如何在 R 中实现这一点?

非常感谢

【问题讨论】:

  • 你可以使用max.col(df)

标签: r dataframe merge multiple-columns


【解决方案1】:

我们可以使用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))

【讨论】:

  • 没有必要指定 ties.method,因为每行只能有一个 1
  • @docendodiscimus 谢谢,我知道你先发布了 cmets,但我尝试了很多次,我不得不等待 60 秒才能发布一个 :-)
【解决方案2】:

谢谢大家。我也想出了一个解决办法。如果我的 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
}

【讨论】:

    猜你喜欢
    • 2018-02-10
    • 2017-10-15
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多