【问题标题】:Converting multiple boolean columns to single factor column将多个布尔列转换为单因子列
【发布时间】:2023-03-07 03:40:01
【问题描述】:

我的数据框如下所示:

      A S1 S2 S3 S4
1   ex1  1  0  0  0
2   ex2  0  1  0  0
3   ex3  0  0  1  0
4   ex4  1  0  0  0
5   ex5  0  0  0  1
6   ex6  0  1  0  0
7   ex7  1  0  0  0
8   ex8  0  1  0  0
9   ex9  0  0  1  0
10 ex10  1  0  0  0

我需要将其作为单一因素列表,例如:

A   Type
ex1 S1
ex2 S2
ex3 S3
ex4 S1
ex5 S4
ex6 S2
ex7 S1
ex8 S2
ex9 S3
ex10 S1

有人帮我解决问题吗?

【问题讨论】:

  • 为什么投反对票?

标签: r matrix multiple-columns


【解决方案1】:

假设d是数据,新列可以用

d$type <- names(d[-1])[apply(d[-1] == 1, 1, which)]
d[c(1, 6)]
#       A type
# 1   ex1   S1
# 2   ex2   S2
# 3   ex3   S3
# 4   ex4   S1
# 5   ex5   S4
# 6   ex6   S2
# 7   ex7   S1
# 8   ex8   S2
# 9   ex9   S3
# 10 ex10   S1

【讨论】:

  • +1,太好了!只有一个问题:尽管您在回答中也使用了apply,但它是否完全矢量化了?
  • 嗯,不完全。但是很多时候你可以把sapplyapply放在那里让它更快。
  • 嗯,我可以想象使用sapply 而不是apply(在可能的情况下)更快,但是使用apply 使其更快是什么意思?不确定我是否理解。
  • 我的意思是当它在[]之间时
  • 是的,我只是想这就是你的意思。你就在那儿 - 很好。
【解决方案2】:

您可以使用apply并检查第2-5列中的最大值,然后返回相应的列名:

df$Type <- apply(df[2:5], 1, function(x) names(df)[which.max(x)+1] )

之后,您可以删除不再需要的列:

df <- df[,-c(2:5)]

【讨论】:

  • 它适用于 5 列的小型数据集,但是当使用大型数据集时,它会抛出错误“'closure' 类型的对象不是子集”。任何想法
  • 不确定,您是否检查了所有相关列是否为logicalnumericinteger?只要输入是同类型的,大数据集应该没有问题。
【解决方案3】:

也可以(如果dat 是您的数据集)

library(reshape2)
dat <- melt(dat, id = "A")
dat[dat$value > 0, 1:2]

【讨论】:

    【解决方案4】:

    您可以尝试: 如果df 是数据框

    data.frame(A=df$A, Type=rep(names(df)[-1], nrow(df))[!!t(df[,-1])])
        A Type
    1   ex1   S1
    2   ex2   S2
    3   ex3   S3
    4   ex4   S1
    5   ex5   S4
    6   ex6   S2
    7   ex7   S1
    8   ex8   S2
    9   ex9   S3
    10 ex10   S1
    

    还有:

       names(df)[-1][t(df[-1])*seq_len(ncol(df)-1)]
     [1] "S1" "S2" "S3" "S1" "S4" "S2" "S1" "S2" "S3" "S1"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-02
      • 2016-01-15
      • 2016-03-09
      • 1970-01-01
      • 2021-01-03
      • 1970-01-01
      • 2011-12-22
      相关资源
      最近更新 更多