我的数据带有时间戳列,如下所示
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),但却陷入哈希或分配命名。
答案 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的值替换为。