【问题标题】:Add Conditional Calculated Column to R Dataframe将条件计算列添加到 R 数据框
【发布时间】:2015-12-31 17:39:47
【问题描述】:

如果第 1 列大于 0 且前一行的第 1 列小于 0,我需要向数据框中添加一列标记为“X”。

所以给定:

c1 = c(0,1,-1,1,2,0,1)

testdf <- data.frame(c1)

我想在 testdf 中添加“新”列:

| c1 | new |

+----+-----+

|  0 |     |

|  1 |     |

| -1 |     |

|  1 | X   |

|  2 |     |

|  0 |     |

|  1 |     |

我相信它需要shift() 的用法,我对它的理解足以使用命令subsetdf <- subset(testdf,c1>0 & shift(c1,1)<0) 创建一个子集

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以试试

    i1 <- with(testdf, c(FALSE,c1[-1] >0 & c1[-length(c1)] < 0 ))
    testdf$new <- ifelse(i1, 'X', '')
    testdf$new 
    #[1] ""  ""  ""  "X" ""  ""  "" 
    

    或使用dplyr

    library(dplyr)
    testdf %>%
           mutate(new=c("", "X")[(c1>0 & lag(c1)< 0)+1L])
    

    mutate 调用中,我们也可以像在其他帖子中一样使用ifelse

    【讨论】:

      【解决方案2】:

      如果您确实想使用 data.table 中的 shift,您可以这样操作:

      library(data.table)
      testdf$c1_lag <- shift(testdf$c1, n=1L)
      testdf$new <- ifelse(testdf$c1 > 0 & testdf$c1_lag < 0, "X", "")
      testdf
      #   c1 c1_lag new
      # 1  0     NA    
      # 2  1      0    
      # 3 -1      1    
      # 4  1     -1   X
      # 5  2      1    
      # 6  0      2    
      # 7  1      0    
      

      【讨论】:

        【解决方案3】:

        使用 dplyr 包和 lag 运算符可以轻松地进行这样的列突变,如下所示:

        library(dplyr)
        testdf <- testdf %>% mutate(new = ifelse(c1 > 0 & lag(c1) < 0, 'X', ''))
        

        【讨论】:

        • 我在同一时间发布。此外,我更喜欢直观的 ifelse() 与子集连接向量。
        猜你喜欢
        • 1970-01-01
        • 2017-11-27
        • 1970-01-01
        • 1970-01-01
        • 2016-02-02
        • 1970-01-01
        • 2016-12-10
        • 2016-01-01
        • 2020-08-02
        相关资源
        最近更新 更多