【问题标题】:Create a new column based on several conditions根据多个条件创建新列
【发布时间】:2020-12-03 00:38:56
【问题描述】:

我想根据对多个列施加的某些条件创建一个新列。例如,这是一个示例数据集:

a <- data.frame(x=c(1,0,1,0,0), y=c(0,0,0,0,0), z=c(1,1,0,0,0))
a
  x y z
1 1 0 1
2 0 0 1
3 1 0 0
4 0 0 0
5 0 0 0

具体来说,如果存在任何特定的行 1,则新列返回 1。如果全部为 0,则新列返回 0。因此具有新列的数据集将是

  x y z w
1 1 0 1 1
2 0 0 1 1
3 1 0 0 1
4 0 0 0 0
5 0 0 0 0

我最初的想法是使用%in%,但无法得到我想要的结果。感谢您的帮助!

【问题讨论】:

    标签: r data-manipulation recode


    【解决方案1】:

    如果您的数据框由二进制值组成,例如,只有01,您可以使用rowSums 尝试下面的代码

    a$w <- +(rowSums(a)>0)
    

    这样

    > a
      x y z w
    1 1 0 1 1
    2 0 0 1 1
    3 1 0 0 1
    4 0 0 0 0
    5 0 0 0 0
    

    【讨论】:

    • 优雅!谢谢!只是好奇,如果数据不是二进制怎么办?例如,如果一行只包含从 1 到 5 的值,则将该值重新编码为 1,如果它包含任何其他值,则重新编码为 2。
    • @cliu 那你可以试试2-(a &gt;= 1) * (a &lt;= 5)重新编码
    【解决方案2】:

    我们可以从matrixStats使用rowMaxs

    library(matrixStats)
    a$w <- rowMaxs(as.matrix(a))
    a$w
    #[1] 1 1 1 0 0
    

    【讨论】:

      【解决方案3】:

      你可以找到每一行的max

      a$w <- do.call(pmax, a)
      a
      
      #  x y z w
      #1 1 0 1 1
      #2 0 0 1 1
      #3 1 0 0 1
      #4 0 0 0 0
      #5 0 0 0 0
      

      这也可以通过apply 来完成:

      a$w <- apply(a, 1, max)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-11
        • 1970-01-01
        • 2020-09-12
        • 1970-01-01
        • 1970-01-01
        • 2019-08-27
        • 2020-10-02
        相关资源
        最近更新 更多