R中唯一ID的列平均值

时间:2016-05-11 17:30:32

标签: r

我想基于唯一标识符对数据集中的列进行平均。我不知道我将为每个唯一标识符添加多少列,或者它们将以何种顺序进入。这些唯一的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)

2 个答案:

答案 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)

这是tidyrdplyr方法:

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