我想学习一种更有效的方法来获得具有不同后缀的平均值,例如_L和_R。
对于每个大脑区域,我想创建一个新的变量,即左右半球之间的平均值。这由后缀_L
和_R
表示。
我在excel中手动完成这项工作,但它可能容易出错。
数据集当前为长格式。示例:对于每个受试者,目标是创建一个新的region
,称为odi.lobar.Temporal_Average
,它是0.030767
和0.371568
的平均值。
subject region value
1 odi.lobar.Temporal_L 0.030767
1 odi.lobar.Temporal_R 0.371568
2 odi.lobar.Temporal_L 0.371568
2 odi.lobar.Temporal_R 0.369251
非常感谢。
在基R中,可以删除带有sub
的后缀并使用aggregate
-
res <- aggregate(value ~ region + subject,
transform(df, region = sub('_.*', '', region)), mean, na.rm = TRUE)
res
# region subject value
#1 odi.lobar.Temporal 1 0.2011675
#2 odi.lobar.Temporal 2 0.3704095
如果您想要每个subject
的平均值,并且如果每个subject
只有一个值用于每个region
:
数据:
df <- data.frame(subject = c("1","1","2","2"),
region = c("odi.lobar.Temporal_L","odi.lobar.Temporal_R","odi.lobar.Temporal_L","odi.lobar.Temporal_R"),
value = c(0.030767,0.371568,0.371568,0.369251))
代码:
library(dplyr)
output <- df %>%
group_by(subject) %>%
summarise(odi.lobar.Temporal_Average= mean(value))
输出:
subject odi.lobar.Temporal_Average
<chr> <dbl>
1 1 0.201
2 2 0.370
编辑:如果你想保留初始数据:
output <- df %>%
group_by(subject) %>%
summarise(odi.lobar.Temporal_Average = mean(value))%>%
pivot_longer(odi.lobar.Temporal_Average) %>%
rename(region = name) %>%
bind_rows(df) %>%
arrange(subject)
输出:
subject region value
<chr> <chr> <dbl>
1 1 odi.lobar.Temporal_Average 0.201
2 1 odi.lobar.Temporal_L 0.0308
3 1 odi.lobar.Temporal_R 0.372
4 2 odi.lobar.Temporal_Average 0.370
5 2 odi.lobar.Temporal_L 0.372
6 2 odi.lobar.Temporal_R 0.369
library(tidyverse)
df1 %>%
separate(region, c("region", "side"), sep = "_") %>%
group_by(subject, region = paste0(region, "_Average")) %>%
summarize(value = mean(value), .groups = "drop") %>%
bind_rows(df1)
# A tibble: 6 x 3
subject region value
<int> <chr> <dbl>
1 1 odi.lobar.Temporal_Average 0.201
2 2 odi.lobar.Temporal_Average 0.370
3 1 odi.lobar.Temporal_L 0.0308
4 1 odi.lobar.Temporal_R 0.372
5 2 odi.lobar.Temporal_L 0.372
6 2 odi.lobar.Temporal_R 0.369