gpt4 book ai didi

按行平均超过增加号。在 mutate : dplyr R 内使用 for 循环的列数

转载 作者:行者123 更新时间:2023-12-05 01:51:52 25 4
gpt4 key购买 nike

我想做这样的事情。

a <- data.frame(A=c(1,5,9),
B=c(2,6,10),
C=c(3,7,11),
D=c(4,8,12))

a <- a %>% rowwise()
a <- a %>% mutate(mean(c_across(1:2)))
a <- a %>% mutate(mean(c_across(1:3)))
a <- a %>% mutate(mean(c_across(1:4)))

这给出:

A   B   C   D  mean(c_across(1:2)) mean(c_across(1:3)) mean(c_across(1:4))
1 2 3 4 1.5 2 2.5
5 6 7 8 5.5 6 6.5
9 10 11 12 9.5 10 10.5

我想使用 for 循环获得相同的结果。我试过这个:

a <- data.frame(A=c(1,5,9),
B=c(2,6,10),
C=c(3,7,11),
D=c(4,8,12))

a <- a %>% rowwise()
for(i in 2:4){
a <- a %>% mutate(mean(c_across(1:i)))
}

但它只显示最后一个i=4的结果

A   B   C   D  mean(c_across(1:i))
1 2 3 4 2.5
5 6 7 8 6.5
9 10 11 12 10.5

谁能解释一下发生了什么?每当我在使用 dplyr 时使用 for 循环,我立即觉得我做错了什么。还有其他更好的方法吗?

最佳答案

您可以使用 purrr::reduce(或 base::Reduce)进行迭代。

library(tidyverse)

reduce(2:4, ~ mutate(.x, !!paste0("col1to", .y) := mean(c_across(1:.y))), .init = rowwise(a))

# A tibble: 3 x 7
# Rowwise:
A B C D col1to2 col1to3 col1to4
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 2 3 4 1.5 2 2.5
2 5 6 7 8 5.5 6 6.5
3 9 10 11 12 9.5 10 10.5
  • base::Reduce 版本:
Reduce(\(x, y) mutate(x, !!paste0("col1to", y) := mean(c_across(1:y))), 2:4, init = rowwise(a))

要修复您的 for 循环,您需要为每个新列设置不同的列名。否则,每个新列都将具有相同的名称,即 "mean(c_across(1:i))",并覆盖之前的列。

b <- rowwise(a)
for(i in 2:4) {
b <- b %>% mutate(!!paste0("col1to", i) := mean(c_across(1:i)))
}

b

使用 tidyr::unnest_wider() 的另一种选择:

a %>%
rowwise() %>%
mutate(mean = list(cummean(c_across(1:4))[-1])) %>%
unnest_wider(mean, names_sep = "_")

关于按行平均超过增加号。在 mutate : dplyr R 内使用 for 循环的列数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71934601/

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