【发布时间】:2015-05-05 10:53:09
【问题描述】:
我有一个相当杂乱无章的数据框,其中一列中相同类别的名称各不相同。我想用 dplyr 总结一下那些乱七八糟的名字。
这是一个关于树种及其特征的简化数据集:
df <- data.frame(species = c('sp1', 'sp1', 'sp1', 'sp2', 'sp2'), tr = c('leaf nitrogen per mass', 'wood den', 'nitrogen (per mass)', 'leaf carbon per area', 'wood dens'), val = sample(1:10, 5), stringsAsFactors=F)
所以每个物种在这个数据集中都有许多不同类别的特征值。
您可以使用 dplyr 和下面的代码获取每个物种的汇总统计数据。
library(dplyr)
by_sp<- df %>%
group_by(species, tr)
by_sp %>% summarize(avg = mean(val))
您可以看到它将相同的特征视为单独的,因为它们不完全匹配。我想对这些使用模糊匹配对许多不同的特征进行总结,但不知道如何同时在许多特征中实现这一点。到目前为止,我已经尝试使用 grepl 创建一个“必需”字符串向量来过滤。例如。
lmass <- 'nitrogen|mass'
by_sp %>% filter(grepl(lmass, tr, ignore.case=T)) %>% summarize(ave = mean(val))
但这是使用“或”,而我想要“和”- 需要两个字符串,以便最终数据帧是包含氮和质量的所有行的单一平均值(在列 tr 中)。
此外,我还有许多这些特征字符串,我希望最后有一个数据框,其中包含每个物种这些特征的平均值。到目前为止,我已经尝试过组合不同的搜索字符串,但这不起作用。
wood <- 'wood den' #this could have other keywords required for this trait
alltr <- c(lmass, wood)
leaf_tr %>% filter(grepl(alltr, tr, ignore.case=T)) %>% summarize(ave = mean(val)) #gives an error, only takes first element in alltr
任何帮助将不胜感激!
【问题讨论】: