gpt4 book ai didi

r - 突变多个/连续的列(使用dplyr或base R)

转载 作者:行者123 更新时间:2023-12-04 11:22:00 24 4
gpt4 key购买 nike

我正在尝试创建代表重复测量的变量“波动”。具体来说,我正在尝试创建表示变量1-10、11-20 ... 91-100的平均值的连续变量。请注意,“...”表示第3至第9波的变量,因为避免输入这些是我的目标!

这是一个示例数据帧df,具有10行100列:

mat <- matrix(runif(1000, 1, 10), ncol = 100)
df <- data.frame(mat)
dim(df)
> 10 100

我使用了 dplyr函数 mutate,一旦键入所有变量,该函数便会起作用,但是它很耗时且容易出错。我一直无法找到一种方法,而不必手动输入各列的名称,就像我在下面开始的那样(请注意,“...”表示第3到9浪):
df <- df %>% 
mutate(wave_1 = (X1 + X2 + X3 + X4 + X5 + X6 + X7 + X8 + X9 + X10) / 10,
wave_2 = (X11 + X12 + X13 + X14 + X15 + X16 + X17 + X18 + X19 + X20) / 10,
...
wave_10 = (X91 + X92 + X93 + X94 + X95 + X96 + X97 + X98 + X99 + X100) / 10)

您可以 mutate用'dplyr'突变多个/连续的列吗?也欢迎其他方法。

最佳答案

这是使用zoo软件包的一种方法:

library(zoo)
t(rollapply(t(df), width = 10, by = 10, function(x) sum(x)/10))

这是使用基数R的一种方法:
splits <- 1:100
dim(splits) <- c(10, 10)
splits <- split(splits, col(splits))
results <- do.call("cbind", lapply(splits, function(x) data.frame(rowSums(df[,x] / 10))))
names(results) <- paste0("wave_", 1:10)
results

以R为底的另一种非常简洁的方式(由G.Grothendieck提供):
t(apply(df, 1, tapply, gl(10, 10), mean))

这是 dplyrtidyr的解决方案:
library(dplyr)
library(tidyr)
df$row <- 1:nrow(df)
df2 <- df %>% gather(column, value, -row)
df2$column <- cut(as.numeric(gsub("X", "", df2$column)),breaks = c(0:10*10))
df2 <- df2 %>% group_by(row, column) %>% summarise(value = sum(value)/10)
df2 %>% spread(column, value) %>% select(-row)

关于r - 突变多个/连续的列(使用dplyr或base R),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34377140/

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