我想基于唯一标识符对数据集中的列进行平均。我不知道我将为每个唯一标识符添加多少列,或者它们将以何种顺序进入。这些唯一的ID都是预先知道的并且是周的列表。我找到了常规模式的解决方案,但没有使用实际列标题来解析平均值的解决方案。感谢您的帮助。
我提供原始数据和所需结果。在示例中,只有2个唯一ID
x = read.table(text = "
site wk1 wk2 wk1 wk1
1 2 4 6 8
2 10 20 30 40
3 5 NA 2 3
4 100 100 NA NA",
sep = "", header = TRUE)
x
desired.outcome = read.table(text = "
site wk1avg wk2avg
1 3.3 4
2 26.6 20
3 3.3 NA
4 NA 100",
sep = "", header = TRUE)
答案 0 :(得分:3)
如果您的原始数据文件具有重复的列名称,read.table
将更改它们,以便所有列都具有唯一值(正如您在示例中检查x
后所看到的那样)。实际上,下面的代码取决于发生的情况,因为melt
将删除具有重复名称的列。然后,我们使用mutate
删除read.table
添加的额外文字,以删除列名称,以便我们可以按周进行分组。
library(reshape2)
library(dplyr)
x %>% melt(id.var="site") %>% # Convert to long format
mutate(variable = gsub("\\..*", "", variable)) %>% # "re-duplicate" original column names
group_by(site, variable) %>%
summarise(mn = mean(value)) %>%
dcast(site ~ variable)
site wk1 wk2
1 1 5.333333 4
2 2 26.666667 20
3 3 3.333333 NA
4 4 NA 100
答案 1 :(得分:1)
这是tidyr
和dplyr
方法:
library(dplyr)
library(tidyr)
x %>% gather(wk, val, -site) %>% # gather wk* columns into key-value pairs
extract(wk, 'wk', '(wk\\d+).*?') %>% # trim suffixes added by read.table
group_by(site, wk) %>%
summarise(mean_val = mean(val)) %>% # calculate grouped means
spread(wk, mean_val) # spread back into wk* columns
# Source: local data frame [4 x 3]
# Groups: site [4]
#
# site wk1 wk2
# (int) (dbl) (dbl)
# 1 1 5.333333 4
# 2 2 26.666667 20
# 3 3 3.333333 NA
# 4 4 NA 100