20

这似乎是一个简单的问题,但我一直在努力解决这个问题:

鉴于此数据框标识了idcontact谁分组的交互contactGrp

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=1maxpos>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 回答
20

我认为这是ddply您正在寻找的版本:

ddply(sessions,.(contactGrp),
      summarise,
      count = length(contact[relpos == 0 & maxpos > 1]))
于 2012-07-20T14:03:38.527 回答
11

您第一次尝试使用 aggregate 行不起作用,因为没有 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 回答