R:数据帧 - 用平均值添加行(R: dataframe - adding rows with means)
我有这样的数据框
subject_id area side value confound1 confound2 confound3 s01 A left 5 154 952 no s01 A right 7 154 952 no s01 B left 15 154 952 no s01 B right 17 154 952 no s02 A left 3 130 870 yes s02 A right 5 130 870 yes s02 B left 12 130 870 yes s02 B right 11 130 870 yes我想为每个主题的每个区域添加左右平均行,同时保留其他变量的值:
subject_id area side value confound1 confound2 confound3 s01 A left 5 154 952 no s01 A right 7 154 952 no s01 A avg 6 154 952 no s01 B left 15 154 952 no s01 B right 17 154 952 no s01 B avg 16 154 952 no s02 A left 3 130 870 yes s02 A right 5 130 870 yes s02 A avg 4 130 870 yes s02 B left 12 130 870 yes s02 B right 11 130 870 yes s02 B avg 11.5 130 870 yes有关如何做到这一点的任何建议?
I have a data frame like this
subject_id area side value confound1 confound2 confound3 s01 A left 5 154 952 no s01 A right 7 154 952 no s01 B left 15 154 952 no s01 B right 17 154 952 no s02 A left 3 130 870 yes s02 A right 5 130 870 yes s02 B left 12 130 870 yes s02 B right 11 130 870 yesI would like to add rows of averages between left and right for each area for each subject while keeping the values of the other variables:
subject_id area side value confound1 confound2 confound3 s01 A left 5 154 952 no s01 A right 7 154 952 no s01 A avg 6 154 952 no s01 B left 15 154 952 no s01 B right 17 154 952 no s01 B avg 16 154 952 no s02 A left 3 130 870 yes s02 A right 5 130 870 yes s02 A avg 4 130 870 yes s02 B left 12 130 870 yes s02 B right 11 130 870 yes s02 B avg 11.5 130 870 yesAny suggestions for how to do this?
最满意答案
这是一个基本R函数aggregate和rbind 。
# get the data df <- read.table(header=T, text="subject_id area side value confound1 confound2 confound3 s01 A left 5 154 952 no s01 A right 7 154 952 no s01 B left 15 154 952 no s01 B right 17 154 952 no s02 A left 3 130 870 yes s02 A right 5 130 870 yes s02 B left 12 130 870 yes s02 B right 11 130 870 yes") # get the average values dfAgg <- aggregate(cbind(value=value, confound1=confound1, confound2=confound2, confound3=confound3) ~ subject_id + area, data=df, FUN=mean) # add variables dfAgg$side <- "side.avg" dfAgg$confound3 <- factor(dfAgg$confound3, labels=c("no", "yes")) #rbind the averages dfFinal <- rbind(df, dfAgg) # order the data dfFinal <- dfFinal[order(dfFinal$subject_id, dfFinal$area, dfFinal$side),]Here is a method with base R functions aggregate and rbind.
# get the data df <- read.table(header=T, text="subject_id area side value confound1 confound2 confound3 s01 A left 5 154 952 no s01 A right 7 154 952 no s01 B left 15 154 952 no s01 B right 17 154 952 no s02 A left 3 130 870 yes s02 A right 5 130 870 yes s02 B left 12 130 870 yes s02 B right 11 130 870 yes") # get the average values dfAgg <- aggregate(cbind(value=value, confound1=confound1, confound2=confound2, confound3=confound3) ~ subject_id + area, data=df, FUN=mean) # add variables dfAgg$side <- "side.avg" dfAgg$confound3 <- factor(dfAgg$confound3, labels=c("no", "yes")) #rbind the averages dfFinal <- rbind(df, dfAgg) # order the data dfFinal <- dfFinal[order(dfFinal$subject_id, dfFinal$area, dfFinal$side),]更多推荐
发布评论