2016-10-27 219 views
0

我有一個時間戳列數據如下動態創建基於唯一列,多個子集值

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新手,任何指導都有幫助。我目前正在使用獨特的(df $ v2),但在哈希卡或指定命名。

回答

0

我最終使用xtabs如下。

xtabs(~v3+v2,data=df) 

這提供了每V2項的計數,然後,我取代的值比0至1

+0

'xtabs'導出來自'stats'命名空間(而不是'dplyr')。 –

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 

但是,這似乎不是你想要的,這就是爲什麼我採取了我所做的方法。

+0

感謝您的方向更大,完整性我用'dplyr'包如以下 – Ffiirree

相關問題