基于包含至少一行中的特定变量的因子级别来子集化数据帧

时间:2013-12-06 12:35:34

标签: r dataframe

我是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 

感谢您的帮助,如果这篇文章不遵循通常的格式,我会道歉。

2 个答案:

答案 0 :(得分:2)

  1. 您应首先过滤数据以删除缺少值的行。由于您没有提供可重现的数据,因此很难知道您是否有真正的缺失值(NA)或只是空的URL字符。

    dat <- dat[!(is.na(dat$url) | nchar(dat$url)==0),]
    
  2. 然后您可以按网址处理。您有很多选择,例如使用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]]

以前代码块的逐步说明:

  1. 首先创建url列的副本。在输入新值时,通常最好存储原始值。
  2. url data.frame的用户ID与原始data.frame中的用户ID匹配。这将给出一个带索引的向量。这些可用于索引url
  3. 创建一个矢量,选择缺少网址的记录。我们只想为那些人估算新的价值。
  4. 通过m[sel],我们得到url中与缺少网址的记录对应的记录索引。当网址丢失的用户未访问其他网站时,此索引为NA。然后我们使用这些索引从url中选择网址。