R 聚合(计数)符合条件的行,按唯一值分组

R 聚合(计数)符合条件的行,按唯一值分组,r,R,这似乎是一个很简单的问题,但我一直在竭尽全力让它发挥作用: 鉴于此数据框确定了id与contact之间的交互作用,联系人按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 sar

这似乎是一个很简单的问题,但我一直在竭尽全力让它发挥作用:

鉴于此数据框确定了
id
contact
之间的交互作用,联系人按
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=1
maxpos>1
的联系人有多少

预期结果将是:

1 west   1
2 south  1
3 east   0
我尝试过的一小部分行:

  • aggregate(数据,by=list('contactGrp'),FUN=count)
    生成错误,不进行筛选
  • 使用
    data.table
    似乎需要一个键,该键在此数据中不是唯一的
  • ddply(数据,“contactGrp”,摘要,计数=???)
    不确定使用哪个函数填充
    count
  • ddply(子集(数据,maxpos>1&relpos==0)、c('contactGrp')、函数(df)计数(df$relpos))
    工作正常,但给了我一个额外的列
    x
    ,感觉我把它复杂化了

SQL很简单:
选择contactGrp,从数据中计算(*)作为cnt,其中…按contactGrp分组
,但我正在尝试学习
R
我想这就是您正在寻找的
ddply
版本:

ddply(sessions,.(contactGrp),
      summarise,
      count = length(contact[relpos == 0 & maxpos > 1]))

以下是另一种方法:

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

a以下是
数据。表
解决方案:

> 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
>库(data.table)
>dt dt[,长度(触点[relpos==0&maxpos>1]),by=contactGrp]
contactGrp V1
[1,]西2
[2,]南0
[3,]东0
>dt[,长度(触点[relpos==1&maxpos>1]),by=contactGrp]
contactGrp V1
[1,]西1
[2,]南1
[3,]东0

由于没有函数
count
,因此尝试使用聚合的第一行无效。你的意思是长度。您所要做的就是使用relpos和maxpos的条件数据选择执行该操作,并选择一个伪变量来获取计数(不管是哪个)。然而,内置的
命令不是使用各种灵活的聚合命令,而是为此而设计的

with( data[data$relpos == 1 & data$maxpos > 1,], table(contactGrp) )

我想你的意思是“西2,东0,南0”以达到你的预期效果。实际上relpos=1。但是对于relpos=0,是的,预期结果列错了…嘎!你说得对,对不起。我现在的位置是清晨。:)谢谢其中一些语法对我来说似乎有点模糊:()列表示法,能够将_columnName_u[condition]作为length函数的参数引用。我想我有一些阅读工作要做…@Lukasgreebe对不起,
符号是我的习惯,但严格来说并不必要。您还可以使用类似于
c(“contactGrp”)
的内容指定分组变量。“会话”来自何处,为什么其他人在回答中使用“会话”一词?这个问题是从最初的帖子开始编辑的吗?我想joran的意思是包含数据框“数据”?有人能验证一下吗?谢谢