根据唯一列值动态创建多个子集

时间:2016-10-27 22:11:04

标签: r dynamic unique subset

我的数据带有时间戳列,如下所示

   v1 v2      v3                       v4  v5
   1  apple   2/20/2015  12:09:19 AM  100  98 
   2  pear    2/19/2015  12:09:16 AM   98  97
   3  apple   2/19/2015  12:09:17 AM   NA  80
   4  apple   2/17/2015  12:09:11 AM   78  75
   5  pear    2/20/2015  12:09:12 AM   50  62
   6  cherry  2/21/2015  12:09:13 AM   75  75
   7  apple   2/20/2015  12:09:14 AM   75  75

我想确定每天是否每种水果类型都有一个条目。文件大小和水果类型的数量都很大。

首先,对于每种水果类型,我想要动态地返回子集,例如对于苹果

   v1 v2      v3                       v4  v5
   1  apple   2/20/2015  12:09:15 AM  100  98 
   3  apple   2/19/2015  12:09:15 AM   NA  80
   4  apple   2/17/2015  12:09:15 AM   78  75
   7  apple   2/20/2015  12:09:14 AM   75  75

然后对于每种水果类型,我希望计算一天中是否有任何条目(例如,是或否,或如下所示的0或1),例如对于苹果

   v2      v3          sign
   apple   2/17/2015   1
   apple   2/18/2015   0
   apple   2/19/2015   1
   apple   2/20/2015   1 
   apple   2/20/2015   1

我是r的新手,任何指导都很有帮助。我目前正在使用unique(df $ v2),但却陷入哈希或分配命名。

2 个答案:

答案 0 :(得分:0)

返回子集

ap <- subset(df, v2 == "apple")

然后,我想,下面的内容将为您提供您想要的苹果。首先,将v3重新编码为日期。

d$v3 <- as.Date(d$v3, format = "%m/%d/%y")

然后在您想要的范围内创建一系列日期作为数据框,并将其合并,并将所有日期的标记初始设置为0。

dates <- data.frame(v3 = seq.Date(
                     from = as.Date("2/17/15", format = "%m/%d/%y"), 
                     to = as.Date("2/21/15", format = "%m/%d/%y"),
                     by = "days"),
                sign = 0)

ap <- merge(ap, dates, all = TRUE, by = "v3")

最后,当有效数据

时,将sign重新编码为1
ap$sign <- ifelse(!is.na(ap$v4)|!is.na(ap$v5), 1, ap$sign)
ap
          v3    v2  v4 v5 sign
 1 2015-02-17 apple  78 75    1
 2 2015-02-18  <NA>  NA NA    0
 3 2015-02-19 apple  NA 80    1
 4 2015-02-20 apple 100 98    1
 5 2015-02-20 apple  75 75    1
 6 2015-02-21  <NA>  NA NA    0

你可以通过首先拆分数据框,然后基本上循环遍历列表来执行所有相同的步骤来概括这种方法。

splt <- split(d, d$v2)
splt <- lapply(seq_along(splt), function(i) merge(splt[[i]], dates, by = "v3", all = TRUE))
lapply(splt, function(x) {
    x$sign <- ifelse(!is.na(x$v4)|!is.na(x$v5), 1, x$sign)
x
})

[[1]]
          v3    v2  v4 v5 sign
1 2015-02-17 apple  78 75    1
2 2015-02-18  <NA>  NA NA    0
3 2015-02-19 apple  NA 80    1
4 2015-02-20 apple 100 98    1
5 2015-02-20 apple  75 75    1
6 2015-02-21  <NA>  NA NA    0

[[2]]
          v3     v2 v4 v5 sign
1 2015-02-17   <NA> NA NA    0
2 2015-02-18   <NA> NA NA    0
3 2015-02-19   <NA> NA NA    0
4 2015-02-20   <NA> NA NA    0
5 2015-02-21 cherry 75 75    1

[[3]]
          v3   v2 v4 v5 sign
1 2015-02-17 <NA> NA NA    0
2 2015-02-18 <NA> NA NA    0
3 2015-02-19 pear 98 97    1
4 2015-02-20 pear 50 62    1
5 2015-02-21 <NA> NA NA    0

修改

我还应该提到,如果你想要的只是按水果每天的参赛作品数量,那就更容易了,方法是dplyr,如下所示:

d %>% 
    group_by(v2, v3) %>% 
    summarize(n = n())

      v2         v3     n
   <chr>     <date> <int>
1  apple 2015-02-17     1
2  apple 2015-02-19     1
3  apple 2015-02-20     2
4 cherry 2015-02-21     1
5   pear 2015-02-19     1
6   pear 2015-02-20     1

但这似乎并不是你想要的,这就是我采用我做的方法的原因。

答案 1 :(得分:0)

我最终使用xtabs如下。

xtabs(~v3+v2,data=df)

这提供了每个v2项目的计数,然后我将大于0的值替换为。