1

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

どんな助けでも大歓迎です!

4

1 に答える 1

3

これがdata.tableソリューションです。あなたが を求めていることは知っていますがdplyr、残念ながら私が遭遇した問題のいくつかは私のdplyrスキルを超えていました (例: で複数の列を作成するmutate):

# setup regular expressions, etc.

library(data.table); library(reshape2)    
traits <- c(nm="nitrogen.*mass", wd="wood den", ca="carbon.*area")
trait.nm <- names(traits)
DT <- data.table(df)  # make data table

DT[,  # Add a column for each trait, indicating whether row matches the trait
  c(trait.nm):=
    data.frame(sapply(trait.nm, function(x) grepl(traits[x], tr)))
]    
melt(DT, id.vars=names(df))[           # transform to long format
  value == TRUE,                       # filter for trait-val combinations that match  
  sum(val), by=.(species, variable)    # group by standardized trait
]

これにより、次が生成されます。

   species variable V1
1:     sp1       nm 13
2:     sp1       wd  3
3:     sp2       wd  1
4:     sp2       ca  2

「カーボンエリア」カテゴリを追加したことに注意してください。窒素質量に関する「OR」問題を解決するために、正規表現を に変更しました"nitrogen.*mass"

これに関する 1 つの大きな注意点は、各特性が 1 つの正規表現のみに一致することを確認する必要があることです。そうしないと、特性が異なる特性カテゴリで複数回カウントされることになります。

于 2015-03-04T14:25:52.953 に答える