R根据条件更改组中的最小值

Posted

技术标签:

【中文标题】R根据条件更改组中的最小值【英文标题】:R Change smallest value in group based on condition 【发布时间】: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

谢谢!

【问题讨论】:

【参考方案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

【讨论】:

以上是关于R根据条件更改组中的最小值的主要内容,如果未能解决你的问题,请参考以下文章

根据复选框条件验证输入文本字段(最大值和最小值)

在EXCEL中,根据条件求第K个最大值或最小值

如何根据R中另一列的日期(月/日/年)计算列的年/月平均值、最大值、最小值等

如何查找excel一行中最小值

堆栈中的最小值

MySQL:在同一行中的某些条件下选择值和最小值