【问题标题】:R Change smallest value in group based on conditionR根据条件更改组中的最小值
【发布时间】:2022-01-13 19:33:09
【问题描述】:

如果组中条件的计数为1,我想知道如何更改组中最小的非零值。

例如,给定数据框:

df1 <- data.frame(x = unlist(map(letters[1:3], function(i) rep(i,4))),
                  y = rep('var',12),
                  z = c(c(10,0,'x',40), c(1,2,3,6),c(1,'x','x',6)))

df1

   x   y  z
1  a var 10
2  a var  0
3  a var  x
4  a var 40
5  b var  1
6  b var  2
7  b var  3
8  b var  6
9  c var  1
10 c var  x
11 c var  x
12 c var  6

我希望 a[1,3] 更改为 x 因为 col x 的 a 组中只有一个“x”,而 10 是该组中获取数据帧的最小非零值:

  x   y  z
1  a var  x
2  a var  0
3  a var  x
4  a var 40
5  b var  1
6  b var  2
7  b var  3
8  b var  6
9  c var  1
10 c var  x
11 c var  x
12 c var  6

谢谢!

【问题讨论】:

    标签: r group-by


    【解决方案1】:

    我们按'x'分组,通过检查'z'中'x'值的计数来创建if/else条件,如果计数为1,则replace'z'中的值,其中'z '值等于min的数值(0转换为NA-na_if后)为'x'

    library(dplyr)
    library(stringr)
    df1 %>% 
       group_by(x) %>% 
       mutate(z = if(sum(z == 'x') == 1) replace(z, 
           z == min(as.numeric(str_subset(na_if(z, '0'), '^[0-9.]+$')),
               na.rm = TRUE), 'x') else z) %>% 
       ungroup
    

    -输出

    # A tibble: 12 × 3
       x     y     z    
       <chr> <chr> <chr>
     1 a     var   x    
     2 a     var   0    
     3 a     var   x    
     4 a     var   40   
     5 b     var   1    
     6 b     var   2    
     7 b     var   3    
     8 b     var   6    
     9 c     var   1    
    10 c     var   x    
    11 c     var   x    
    12 c     var   6    
    

    【讨论】:

      【解决方案2】:

      我认为 akruns 解决方案更好,但这只是一个想法,因为我更喜欢 data.table 而不是 dplyr:

      library(data.table)
      df1 = data.table(df1)
      
      for (i in unique(df1$x)) {
        if (length(df1[x==i & z=="x", z]) == 1){
          df1[x==i & z==min(df1[x==i & z!=0, z]), z:="x"]
        }
      }
      

      还有输出:

       > df1
          x   y  z
       1: a var  x
       2: a var  0
       3: a var  x
       4: a var 40
       5: b var  1
       6: b var  2
       7: b var  3
       8: b var  6
       9: c var  1
      10: c var  x
      11: c var  x
      12: c var  6
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-30
        • 1970-01-01
        • 1970-01-01
        • 2022-01-05
        • 1970-01-01
        • 1970-01-01
        • 2018-07-03
        • 1970-01-01
        相关资源
        最近更新 更多