20

それはとても単純な問題のように思えますが、私はこれを機能させるために髪を引っ張ってきました:

によってグループ化された人とidの相互作用を識別するこのデータフレームを考えると、contactcontactGrp

head(data)
   id               sesTs  contact    contactGrp   relpos   maxpos
1 6849 2012-06-25 15:58:34   peter        west    0.000000      3
2 6849 2012-06-25 18:24:49   sarah        south   0.500000      3
3 6849 2012-06-27 00:13:30   sarah        south   1.000000      3
4 1235 2012-06-29 17:49:35   peter        west    0.000000      2
5 1235 2012-06-29 23:56:35   peter        west    1.000000      2
6 5893 2012-06-30 22:21:33   carl         east    0.000000      1

と でどこに連絡先がいくつunique(data$contactGrp)ありrelpos=1ますmaxpos>1か?

予想される結果は次のようになります。

1 west   1
2 south  1
3 east   0

私が試した行の小さなサブセット:

  • aggregate(data, by=list('contactGrp'), FUN=count)エラーが発生し、フィルタリングされません
  • usingdata.tableにはキーが必要なようですが、このデータでは一意ではありません…</li>
  • ddply(data,"contactGrp",summarise,count=???)count列を埋めるために使用する関数がわからない
  • ddply(subset(data,maxpos>1 & relpos==0), c('contactGrp'), function(df)count(df$relpos))動作しますが、余分な列が表示xされ、複雑になりすぎているように感じます...</li>

SQL は簡単ですSelect contactGrp, count(*) as cnt from data where … Group by contactGrpが、学習しようとしていますR

4

4 に答える 4

24

そして、ここにdata.table解決策があります:

> library(data.table)
> dt <- data.table(sessions)
> dt[, length(contact[relpos == 0 & maxpos > 1]), by = contactGrp]
     contactGrp V1
[1,]       west  2
[2,]      south  0
[3,]       east  0

> dt[, length(contact[relpos == 1 & maxpos > 1]), by = contactGrp]
     contactGrp V1
[1,]       west  1
[2,]      south  1
[3,]       east  0
于 2012-07-20T14:38:01.817 に答える
11

function がないため、集計を使用して最初に試行した行は機能しませんcount。あなたが意味しlengthた。あなたがしなければならなかったのは、relpos と maxpos の条件付きデータ選択でそれを実行し、ダミー変数を選択してカウントを取得することだけでした (どちらでもかまいません)。それにもかかわらず、さまざまな種類の柔軟な集約コマンドを使用する代わりに、組み込みtableコマンドはこのために設計されています。

with( data[data$relpos == 1 & data$maxpos > 1,], table(contactGrp) )
于 2012-07-20T17:38:14.953 に答える
10

別のアプローチを次に示します。

a <- data.frame(id=1:10, contact=sample(c("peter", "sahrah"), 10, T), contactGrp=sample(c("west", "east"), 10, T), relpos=sample(0:1, 10, T), maxpos=runif(10, 0,10))

library(sqldf)
sqldf("Select contactGrp, count(*) as cnt from a where relpos=0 and maxpos > 1 Group by contactGrp")
  contactGrp cnt
1       east   3
2       west   1
于 2012-07-20T14:09:31.150 に答える