【问题标题】:Add a new column based on values in another column根据另一列中的值添加新列
【发布时间】:2021-05-10 19:57:30
【问题描述】:

我正在使用 R-studio。我想根据另一个名为 period 的列的值创建一个名为干预的新列。因此,如果 period 小于 0,则返回 0。如果 period > 0,则返回 1、2、3 等等。如果 period = 0,则留空。以下是我的数据框:

period<- c(-12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4,5, 6, 7, 8, 9, 10, 11)

我想要的输出是:

newdf<-data.frame(period = c(-12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4,5, 6, 7, 8, 9, 10, 11),
              intervention = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11))

感谢您的帮助。

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以在逻辑向量上使用cumsum 来创建列,replace '句点'为0到空白的值(''

    library(dplyr)
    out <- tibble(period) %>% 
        mutate(intervention = replace(cumsum(period > 0), period == 0, ''))
    

    【讨论】:

      【解决方案2】:

      您可以简单地使用ifelse 并将值0 更改为"",但是如果您插入一个字符串,您的向量将变成一个字符。也许将"" 更改为NA 会更好。所以你可以将新列用作数字向量

      period<- c(-12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4,5, 6, 7, 8, 9, 10, 11)
      intervention <- ifelse(period<0,0,period)
      intervention[period==0] <- ""
      #probably better
      intervention[period==0] <- NA
      

      【讨论】:

      • 谢谢伊利亚。如果我不想让 0 为空,而是希望 1 从 0 开始,该怎么办。所以,我最终会得到 0(1)、1(2)、2(3) 等等。括号中的数字是新值。任何小于 0 的值仍被编码为 -1 到无穷大,但从 0 开始的值将被编码为 1、2、3、4 等等。感谢您的帮助。
      • 这是你想要的吗:intervention &lt;- ifelse(period&gt;=0,period+1,period)?这样数字 = 0
      • 太棒了。这很好用。非常感谢 Elia。
      【解决方案3】:

      我不确定这是否是您正在寻找的:

      library(dplyr)
      
      period %>%
        as_tibble() %>%
        mutate(intervention = ifelse(value < 0, 0, ifelse(value == 0, "", 
                                                          value)))
      
      # A tibble: 24 x 2
         value intervention
         <dbl> <chr>       
       1   -12 0           
       2   -11 0           
       3   -10 0           
       4    -9 0           
       5    -8 0           
       6    -7 0           
       7    -6 0           
       8    -5 0           
       9    -4 0           
      10    -3 0           
      # ... with 14 more rows
      

      【讨论】:

        【解决方案4】:
        newdf<-data.frame(period = c(-12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4,5, 6, 7, 8, 9, 10, 11))
        newdf$intervention = ifelse(newdf$period < 0 , 0, ifelse(newdf$period ==0, "",newdf$period))
        

        【讨论】:

        • 谢谢阿什什。如果不是让 0 为空,我希望 1 从 0 开始怎么办。所以,我将得到 0(1)、1(2)、2(3) 等等。括号中的数字是新值。任何小于 0 的值仍被编码为 -1 到无穷大,但从 0 开始的值将被编码为 1、2、3、4 等等。感谢您的帮助。
        • 在这种情况下,您不需要 2 个 ifelse。您可以在 if 条件下保留值并在 else 条件下添加 +1。 newdf$intervention = ifelse(newdf$period &lt; 0 , newdf$period, newdf$period+1)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-15
        • 2021-03-23
        • 2021-03-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多