过滤依赖于字符串中的值的数据集

时间:2014-11-26 21:25:26

标签: r sum filtering analytics

我目前正在使用Google Analytics和R,并且有一个查询,希望有人可以帮助我。

我已将我的数据从GA导出到R中,并将其放在准备好处理的数据框中。

我想创建一个for循环,它遍历我的数据并在我的数据框中汇总多个列(如果一列包含特定值)。

例如,我的数据框看起来像这样

datatable

我有一个ID列表,它是个别的3位数字,我可以在for循环中使用。

我过去的R经验我能够过滤列表,以便我有

data[data$ID == 341,] -> datanew

我找到了一些代码,可以看到字符串中是否有某个字符串产生一个bool

grepl(value, chars)

有没有办法将它们连接在一起,以便我有一个类似于下面的总和代码

aggregate(cbind(users, conversion)~ID,data=datanew,FUN=sum) -> resultforID

基本上取这些数据并为每个341添加用户和转换..

我希望我能以最好的方式解释这一点。

提前致谢

数据表有3列。 ID,用户,与用户的转化以及与ID相关联的转化。

有些ID是自己的,所以341,其他是341 | 246,有些会有三个数字与它们分开|

4 个答案:

答案 0 :(得分:1)

# toy data
mydata = data.frame(ID = c("341|243","341|243","341|242","341","243",
                           "999","111|341|222"),
                    Users = 10:16,
                    Conv = 5:11)

#            ID Users Conv
# 1     341|243    10    5
# 2     341|243    11    6
# 3     341|242    12    7
# 4         341    13    8
# 5         243    14    9
# 6         999    15   10
# 7 111|341|222    16   11

# are you looking for something like below:
# presume you just want to filter those IDs have 341.
library(dplyr)
mydata[grep("341",mydata$ID),] %>%
  group_by(ID) %>%
  summarise_each(funs(sum))

#            ID Users Conv
# 1 111|341|222    16   11
# 2         341    13    8
# 3     341|242    12    7
# 4     341|243    21   11

答案 1 :(得分:1)

如果我理解您的问题,您可能需要查看我的" splitstackshape"中的cSplit。包。

使用@ KFB的样本数据(希望能够代表您的实际数据),请尝试:

library(splitstackshape)
cSplit(mydata, "ID", "|", "long")[, lapply(.SD, sum), by = ID]
#     ID Users Conv
# 1: 341    62   37
# 2: 243    35   20
# 3: 242    12    7
# 4: 999    15   10
# 5: 111    16   11
# 6: 222    16   11

或者,从Hadleyverse,您可以使用" dplyr"和" tidyr"像这样:

library(dplyr)
library(tidyr)
mydata %>% 
  transform(ID = strsplit(as.character(ID), "|", fixed = TRUE)) %>% 
  unnest(ID) %>% 
  group_by(ID) %>% 
  summarise_each(funs(sum))
# Source: local data frame [6 x 3]
# 
#    ID Users Conv
# 1 111    16   11
# 2 222    16   11
# 3 242    12    7
# 4 243    35   20
# 5 341    62   37
# 6 999    15   10

答案 2 :(得分:0)

我认为这应该有效:

library(dplyr)
sumdf <- yourdf %>%
           group_by(ID) %>%
           summarise_each(funs(sum))

我不清楚您的ID列的结构,但如果您需要获取数字,可以试试这个:

library(tidyr)
newdf <- separate(yourdf, ID, c('id1', 'id2'), '|') %>%
         filter(id1 == 341)  # optional if you just want one ID

答案 3 :(得分:0)

这是两个答案。第一个是子集,第二个是&#39; grep&#39;使用字符串

初次运行

x1<-sample(1:4,10,replace=TRUE)
x2<-sample(10:40,10)
x3<-sample(10:40,10)

dat<-as.data.frame(cbind(x1,x2,x3))

for(i in unique(dat$x1)) {
    dat1<-subset(dat,subset=x1==i)
    z<-(aggregate(.~x1,data=dat1,FUN=sum))
    assign(paste0('x1',i),z)
}

GREP

x1<-sample(letters[1:3],10,replace=TRUE)
x2<-sample(10:40,10)
x3<-sample(10:40,10)

dat<-as.data.frame(cbind(x1,x2,x3))

for(i in unique(dat$x1)) {
    dat1<-dat[grep(i,dat$x1),]
    z<-(aggregate(.~x1,data=dat1,FUN=sum))
    assign(paste0('x1',i),z) #this will assign separate objects as your aggregates with names based on the string
}