【问题标题】:Add a column that shows whether the two previous columns include 0 or not添加一列,显示前两列是否包含 0
【发布时间】:2021-04-05 19:53:07
【问题描述】:

我有一个名为dat 的data.frame。我想添加一个名为dif 的新列。然后,在每一行中,如果 lowerupper 范围包括 0(例如,第一行中的 -0.410.1)我希望 dif 值显示 FALSE 否则(例如,0.100.2 第二行)TRUE

对于任何类似的 data.frame 是否可以在 R 中执行此操作(以下是一个玩具示例,功能性答案值得赞赏)?

dat <- data.frame(lower = c(-0.41, .1, -.2), upper = 1:3*.1, row.names = paste("a", 1:3)) # add a column called `dif`


desired_output <- data.frame(lower = c(-0.41, .1, -.2), upper = 1:3*.1, dif = c(F,T,F), row.names = paste("a", 1:3))

【问题讨论】:

    标签: r function dataframe loops lapply


    【解决方案1】:

    这是另一个使用 do.call* 的基本 R 选项

    dat$dif <- do.call("*", dat) > 0
    

    这样

    > dat
        lower upper   dif
    a 1 -0.41   0.1 FALSE
    a 2  0.10   0.2  TRUE
    a 3 -0.20   0.3 FALSE
    

    【讨论】:

      【解决方案2】:

      我们可以从dplyr使用mutate

      library(dplyr)
      mutate(dat, dif = lower > 0 | upper < 0)
      

      或者base R中的一个选项

      Reduce(`|`, Map(function(x, y)  match.fun(y)(x, 0), dat, c(">", "<")))
      #[1] FALSE  TRUE FALSE
      

      【讨论】:

      • @rnorouzian 谢谢。我展示了一个Map 方法,以防您对不同列进行多次比较
      【解决方案3】:

      你可以使用:

      transform(dat, dif = lower > 0 | upper < 0)
      
      #  lower upper   dif
      #1 -0.41   0.1 FALSE
      #2  0.10   0.2  TRUE
      #3 -0.20   0.3 FALSE
      

      【讨论】:

        【解决方案4】:

        你可以使用dplyr::between:

        library(dplyr)
        
        dat %>% 
          rowwise() %>% 
          mutate(dif = !between(0, lower, upper))
        

        输出

        # A tibble: 3 x 3
        # Rowwise: 
          lower upper dif  
          <dbl> <dbl> <lgl>
        1 -0.41   0.1 FALSE
        2  0.1    0.2 TRUE 
        3 -0.2    0.3 FALSE
        

        【讨论】:

        • 啊!有一个问题,我的实际数据有行名,应用您的解决方案会删除行名!
        • 是真的,tidyverse doesn't like rownames as having a special status, distinct from columns。您可以通过使用dat %&gt;% mutate(rn = row.names(.), .before = everything()) 启动链来解决此问题。但是,除非您致力于将所有内容保持在 tidyverse 中,否则在您的情况下这是不必要的额外步骤。
        • 保留行名 Andrew 至关重要。我正在做多重比较,唯一让用户不会对输出感到困惑的是行名。谢谢,不过我会支持您的解决方案。
        • 明白了——只是说行名实际上只是另一种列,从这个意义上说保留它们并不难——尤其是对于多重比较。数据框索引没有像在 Python 中那样在 R 中获得特权状态。所以整个 tidyverse 框架鼓励将数据移动到列格式,包括行名/索引。但这更像是一种哲学立场,而不是实际立场,imo,而且@Ronak Shah 的解决方案提供了一种简单的基本 R 方法来保留行名,我认为这是一个很好的更好的解决方案。
        猜你喜欢
        • 2022-09-30
        • 1970-01-01
        • 2019-06-10
        • 2020-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多