gpt4 book ai didi

r - 结合: rowwise(), mutate(),crossover()以实现多种功能

转载 作者:行者123 更新时间:2023-12-03 15:26:59 25 4
gpt4 key购买 nike

这在某种程度上与此question有关:
原则上,我尝试了解使用多于1种功能(如(rowwisemutatemean()等)的多列sum()min()操作是如何工作的。
我了解到across可以完成这项工作,而不是c_across
我了解到函数mean()与函数min()的不同之处在于mean()在数据帧上不起作用,我们需要将其更改为vector,这可以使用unlist或as.matrix完成->从Ronak Shah here获悉Understanding rowwise() and c_across()
现在以我的实际情况为例:我能够执行此任务,但是我松开了一列d。如何避免此设置中d列的松动。
我的df:

df <- structure(list(a = 1:5, b = 6:10, c = 11:15, d = c("a", "b", 
"c", "d", "e"), e = 1:5), row.names = c(NA, -5L), class = c("tbl_df",
"tbl", "data.frame"))
无效:
df %>% 
rowwise() %>%
mutate(across(a:e),
avg = mean(unlist(cur_data()), na.rm = TRUE),
min = min(unlist(cur_data()), na.rm = TRUE),
max = max(unlist(cur_data()), na.rm = TRUE)
)

# Output:
a b c d e avg min max
<int> <int> <int> <chr> <int> <dbl> <chr> <chr>
1 1 6 11 a 1 NA 1 a
2 2 7 12 b 2 NA 12 b
3 3 8 13 c 3 NA 13 c
4 4 9 14 d 4 NA 14 d
5 5 10 15 e 5 NA 10 e
可行,但我松了 d列:
df %>% 
select(-d) %>%
rowwise() %>%
mutate(across(a:e),
avg = mean(unlist(cur_data()), na.rm = TRUE),
min = min(unlist(cur_data()), na.rm = TRUE),
max = max(unlist(cur_data()), na.rm = TRUE)
)

a b c e avg min max
<int> <int> <int> <int> <dbl> <dbl> <dbl>
1 1 6 11 1 4.75 1 11
2 2 7 12 2 5.75 2 12
3 3 8 13 3 6.75 3 13
4 4 9 14 4 7.75 4 14
5 5 10 15 5 8.75 5 15

最佳答案

pmap()使用purrr可能更可取,因为您只需要选择一次数据,就可以使用select助手:

df %>% 
mutate(pmap_dfr(across(where(is.numeric)),
~ data.frame(max = max(c(...)),
min = min(c(...)),
avg = mean(c(...)))))

a b c d e max min avg
<int> <int> <int> <chr> <int> <int> <int> <dbl>
1 1 6 11 a 1 11 1 4.75
2 2 7 12 b 2 12 2 5.75
3 3 8 13 c 3 13 3 6.75
4 4 9 14 d 4 14 4 7.75
5 5 10 15 e 5 15 5 8.75
或加上 tidyr:
df %>% 
mutate(res = pmap(across(where(is.numeric)),
~ list(max = max(c(...)),
min = min(c(...)),
avg = mean(c(...))))) %>%
unnest_wider(res)

关于r - 结合: rowwise(), mutate(),crossover()以实现多种功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67347390/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com