我是R的新手,我总是先尝试查找解决方案,然后再询问(到目前为止,我从来没有问过,因为解决方案已在互联网上的某处提供)。话虽如此,我甚至无法为我的问题提出搜索查询。
我有来自多个网站的个人综合浏览量数据(请参阅下面的示例,如果不符合通常的格式标准,则抱歉)。第3行中缺少网址的示例。数据框称为a,并通过read.csv:
加载a<-read.csv("201311.csv",sep=",",colnames=c("Timestamp","user_id","url")
导致:
Timestamp user_id url
2013-11-01 176b24938a domain1.xy/z/66546,66546
2013-11-01 6785504947 domain2.xy/z/66346,66346
2013-10-31 0717e6b5dc
我将所有数据集中在一个55M行的文件中。我需要将此文件拆分为每个网站的单个文件。麻烦的是,并非每个网页浏览都有记录的网址(技术问题),实际上超过20%的网页浏览错过了网址。假设网站的用户之间应该几乎没有重叠。
我能够通过grepl()函数很容易地通过以下方式对记录的URL进行子集化:
b <- subset(a,grepl("domain1\\.xy",a$url))
现在我的第一个想法是通过user_ids将浏览量分配给各个网站 如果user_id具有至少一个带有记录URL的网页浏览。麻烦的是,我不知道从哪里开始。
理想结果的例子如下(对于domain1):
Timestamp user_id url
2013-11-01 176b24938a domain1.xy/z/66546,66546
2013-11-05 6785504949 domain1.xy/z/66346,66346
2013-10-31 0717e6b5dc
感谢您的帮助,如果这篇文章不遵循通常的格式,我会道歉。
答案 0 :(得分:2)
您应首先过滤数据以删除缺少值的行。由于您没有提供可重现的数据,因此很难知道您是否有真正的缺失值(NA)或只是空的URL字符。
dat <- dat[!(is.na(dat$url) | nchar(dat$url)==0),]
然后您可以按网址处理。您有很多选择,例如使用by
:
by(dat,dat$url,function(x){
fileName <- sprintf("file%s.pdf", unique(x$url)
write.csv(x,fileName)
})
答案 1 :(得分:1)
由于您没有给出具有请求输出的示例数据集,我将不得不猜测:
# generate some data
data <- "Timestamp;user_id;url
2013-11-01;176b24938a;domain1.xy/z/66546,66546
2013-11-01;6785504947;domain2.xy/z/66346,66346
2013-10-31;0717e6b5dc;
2013-12-01;6785504947;"
data <- read.csv2(textConnection(data))
data$url[data$url == ""] <- NA
# select records with url
url <- data[!is.na(data$url), c("user_id", "url")]
# remove duplicate records
url <- url[!duplicated(url), ]
有些用户可能访问过多个网站。在接下来的几行中我删除了这些。但是,这将是检查您的假设的好时机。
# remove user_id with different url's
duplicated_users <- url$user_id[duplicated(url$user_id)]
url <- url[!(url$user_id %in% duplicated_users), ]
最后,我们可以使用url
中的网址将原始数据集中丢失的网址归为
data$url2 <- data$url
m <- match(data$user_id, url$user_id)
sel <- is.na(data$url)
data$url2[sel] <- url$url[m[sel]]
以前代码块的逐步说明:
url
列的副本。在输入新值时,通常最好存储原始值。url
data.frame的用户ID与原始data.frame中的用户ID匹配。这将给出一个带索引的向量。这些可用于索引url
。 m[sel]
,我们得到url
中与缺少网址的记录对应的记录索引。当网址丢失的用户未访问其他网站时,此索引为NA
。然后我们使用这些索引从url
中选择网址。