1 つの列に同じカテゴリのさまざまな名前を持つ、かなり整理されていないデータフレームがあります。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))
しかし、これは「or」を使用していますが、「and」が必要なのに対し、両方の文字列が必要なため、最終的なデータフレームは、窒素と質量の両方を含むすべての行の単一の平均になります (列 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
どんな助けでも大歓迎です!