我正在尝试创建代表重复测量的变量"波形".具体来说,我正在尝试创建表示变量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))
这里是一个解决方案dplyr
和tidyr
:
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)