如何将r中的相同实例分组到同一时间,生成频率和平均统计数据?

时间:2017-04-02 05:00:25

标签: r dataframe merge

我正处于清理/组织数据的最后阶段,并希望了解此步骤的建议。我是R的新手,并不完全了解数据帧或其他数据类型的工作原理。 (我正在努力学习,但有一个项目到期,所以需要一个快速的解决方案)。我已经从CSV文件导入了数据。

我想将实例分组(日期,ID1,ID2,ID3)。我想要输出中所有统计数据的平均值,以及分组实例数的新列。

注意:ID3包含。我想在分组之前将这些重命名为“na” 我尝试过解决方案

tdata$ID3[is.na(tdata$ID3)] <- "NA"   
tdata[["ID3"]][is.na(tdata[["ID3"]])] <- "NA"  

但是得到错误:

In `[<-.factor`(`*tmp*`, is.na(tdata[["ID3"]]), value = c(3L, 3L,  :
  invalid factor level, NA generated

数据是:

      date     ID1     ID2     ID3 stat1 stat2 stat.3
1 12-03-07  abc123  wxy456  pqr123    10    20     30  
2 12-03-07  abc123  wxy456  pqr123    20    40     60  
3 10-04-07  bcd456  wxy456  hgf356    10    20     40  
4 12-03-07  abc123  wxy456  pqr123    30    60     90  
5  5-09-07  spa234  int345   <NA>     40    50     70  

期望输出

date      ID1,     ID2,   ID3,   n, stat1, stat2, stat 3  
12-03-07 abc123, wxy456, pqr457, 3,   20,   40, 60  
10-04-07 bcd456, wxy456, hgf356, 1,   10,   20, 40  
05-09-07 spa234, int345, big234, 1 ,  40,   50, 70  

我尝试了这个解决方案:How to merge multiple data.frames and sum and average columns at the same time in R

但是我没有成功合并必须分组并测试相似性的列。

DF <- merge(tdata$date, tdata$ID1, tdata$ID2, tdata$ID3, by = "Name", all = T)



Error in fix.by(by.x, x) : 'by' must specify uniquely valid columns 

最后,生成n列。也许插入一行1并在总结时使用列的总和?

2 个答案:

答案 0 :(得分:3)

我们可以使用dplyr执行此操作。按“ID”列进行分组后,在分组变量中也添加“日期”和“n”,并获取“{1”}个“stat”列

mean

注意:关于将'NA'更改为'big234',我们可以将'ID3'转换为library(dplyr) df1 %>% group_by(ID1, ID2, ID3) %>% group_by(date = first(date), n =n(), add=TRUE) %>% summarise_at(vars(matches("stat")), mean) 类并在执行上述操作之前进行更改

character

答案 1 :(得分:1)

虽然我发现akrun提出的dplyr解决方案非常直观易用,但也有一个很好的data.table解决方案:

与akrun类似,我假设NA值已转换为“big234”以获得所需的结果。

library(data.table)
# convert data.frame to data.table
data <- data.table(df1)

# return the desired output
data[, c(.N, lapply(.SD, mean)),
     by = list(date, ID1,ID2, ID3)]