将R中的多个二进制列合并为一个保留位置的列
Merging multiple binary columns in R into one column preserving position
我有一个数据框,其中包含 R 中包含二进制数据的 30 列。每行恰好包含一个 1。换句话说,二进制值是互斥的。对于所有三十列,没有两列可以在同一行中包含 1。这是我的意思的例证。
1 0 0
0 1 0
0 0 1
1 0 0
0 0 1
显然,将此信息分布在 30 列上在计算上非常昂贵。我想要做的是将所有这 30 列合并为一列,其中包含 30 个不同的因子变量。例如,新列在第二列有 1 的每一行中包含 2s,在第三列有 1 的每一行中包含 3s,等等。重要的是要保留原始顺序并且位置不会因为它们的行为而弄乱作为其他列的索引。所以上面的 3 列会变成这样:
1
2
3
1
3
如何在 R 中实现这一点?
非常感谢
我们可以使用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))
谢谢大家。我也想出了解决办法。如果我的 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
}
我有一个数据框,其中包含 R 中包含二进制数据的 30 列。每行恰好包含一个 1。换句话说,二进制值是互斥的。对于所有三十列,没有两列可以在同一行中包含 1。这是我的意思的例证。
1 0 0
0 1 0
0 0 1
1 0 0
0 0 1
显然,将此信息分布在 30 列上在计算上非常昂贵。我想要做的是将所有这 30 列合并为一列,其中包含 30 个不同的因子变量。例如,新列在第二列有 1 的每一行中包含 2s,在第三列有 1 的每一行中包含 3s,等等。重要的是要保留原始顺序并且位置不会因为它们的行为而弄乱作为其他列的索引。所以上面的 3 列会变成这样:
1
2
3
1
3
如何在 R 中实现这一点?
非常感谢
我们可以使用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))
谢谢大家。我也想出了解决办法。如果我的 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
}