我目前正在使用Google Analytics和R,并且有一个查询,希望有人可以帮助我。
我已将我的数据从GA导出到R中,并将其放在准备好处理的数据框中。
我想创建一个for循环,它遍历我的数据并在我的数据框中汇总多个列(如果一列包含特定值)。
例如,我的数据框看起来像这样
我有一个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,有些会有三个数字与它们分开|
答案 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)
}
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
}