0

私はしばらくこれを探していましたが、今のところ明確な答えを見つけることができていません。おそらく間違った用語を探していましたが、ここの誰かがすぐに私を助けてくれるかもしれません。質問は基本的なものです。

サンプルデータセット:

set <- structure(list(VarName = structure(c(1L, 5L, 4L, 2L, 3L),
 .Label = c("Apple/Blue/Nice", 
"Apple/Blue/Ugly", "Apple/Pink/Ugly", "Kiwi/Blue/Ugly", "Pear/Blue/Ugly"
), class = "factor"), Color = structure(c(1L, 1L, 1L, 1L, 2L), .Label = c("Blue", 
"Pink"), class = "factor"), Qty = c(45L, 34L, 46L, 21L, 38L)), .Names = c("VarName", 
"Color", "Qty"), class = "data.frame", row.names = c(NA, -5L))

これにより、次のようなデータセットが得られます。

set


      VarName      Color Qty
1 Apple/Blue/Nice  Blue  45
2  Pear/Blue/Ugly  Blue  34
3  Kiwi/Blue/Ugly  Blue  46
4 Apple/Blue/Ugly  Blue  21
5 Apple/Pink/Ugly  Pink  38

私がやりたいことはかなり簡単です。数量列を合計(または平均または標準偏差)したいと思います。ただし、以下の条件でも同じ操作をしたいと思います。

  1. VarNameには「Apple」が含まれます
  2. VarNameには「醜い」が含まれています
  3. 色は「青」に等しい

この種の計算を実行する方法について簡単に紹介してくれる人はいますか?

その一部はaggregate()関数で実行できることを認識しています。例:

aggregate(set[3], FUN=sum, by=set[2])[1,2]

ただし、これを行うには、これよりも簡単な方法があると思います。次のような関数に追加できるフィルターはありsum()ますか?

4

2 に答える 2

2

VarName列を分割する最も簡単な方法は、サブセット化が非常に簡単になることです。だから、varName分離されたオブジェクトを作成しましょう:

##There must(?) be a better way than this. Anyone?
new_set =  t(as.data.frame(sapply(as.character(set$VarName), strsplit, "/")))

簡単な説明:

  • 要因であるas.characterため使用しますset$VarName
  • sapply各値を順番に取得して適用しますstrplit
  • 関数はstrsplit要素を分割します
  • データフレームに変換します
  • 転置して正しい回転を取得する

次、

##Convert to a data frame
new_set = as.data.frame(new_set)
##Make nice rownames - not actually needed
rownames(new_set) = 1:nrow(new_set)
##Add in the Qty column
new_set$Qty = set$Qty

これは与える

R> new_set
     V1   V2   V3 Qty
1 Apple Blue Nice  45
2  Pear Blue Ugly  34
3  Kiwi Blue Ugly  46
4 Apple Blue Ugly  21
5 Apple Pink Ugly  38

これで、すべての操作が標準になりました。例えば、

##Add up all blue Qtys
sum(new_set[new_set$V2 == "Blue",]$Qty)
[1] 146

##Average of Blue and Ugly Qtys
mean(new_set[new_set$V2 == "Blue" & new_set$V3 == "Ugly",]$Qty)
[1] 33.67

正しい形式になったら、必要なddplyすべて(およびそれ以上)を実行するものを使用できます

library(plyr)
##Split the data frame up by V1 and take the mean of Qty
ddply(new_set, .(V1), summarise, m = mean(Qty))

##Split the data frame up by V1 & V2 and take the mean of Qty
ddply(new_set, .(V1, V2), summarise, m = mean(Qty))
于 2012-09-27T10:08:05.287 に答える
1

これはあなたが探しているものですか?

 # sum for those including 'Apple'
 apple <- set[grep('Apple', set[, 'VarName']), ]
 aggregate(apple[3], FUN=sum, by=apple[2])
  Color Qty
1  Blue  66
2  Pink  38

 # sum for those including 'Ugly'
 ugly <- set[grep('Ugly', set[, 'VarName']), ]
 aggregate(ugly[3], FUN=sum, by=ugly[2])
  Color Qty
1  Blue 101
2  Pink  38

 # sum for Color==Blue
 sum(set[set[, 'Color']=='Blue', 3])
[1] 146

最後の合計は、を使用して行うことができますsubset

sum(subset(set, Color=='Blue')[,3])
于 2012-09-27T10:09:53.290 に答える