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根据条件更改组中的最小值的主要内容,如果未能解决你的问题,请参考以下文章