[英]R Change smallest value in group based on condition
如果組中條件的計數為 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
謝謝!
我們按'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
我認為 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"]
}
}
和 output:
> 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.