我正处于清理/组织数据的最后阶段,并希望了解此步骤的建议。我是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并在总结时使用列的总和?
答案 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)]