2016-08-21 133 views
0

我在下面創建了一個我的數據結構示例。R - 轉換數據幀

問題1:我發現「天」實際上是$ start和$ end之間的差異,但它並不反映實際的測量天數。所以對於$ id中的每個id,我需要一個計數器。因此,id = 2應該有值「2」天而不是「4」。

解決方案

Count <- rle(sort(activity$id)) 
activity$count <- Count[[1]][match(activity$id, Count[[2]])] 

問題2:然後,所有的測量,我們沒有準確測量4天必須刪除。在這種情況下,id 1,3,5和6會存活,因爲id 2和4分別只有2和3個數據點。

解決方案

activity <- subset(activity, count== 30) 

問題3:我需要篩選中被標記爲$狀態爲 「已完成」 的情況。在這裏,所有調整後只有ID 1,3和6才能存活。

每個步驟在R中的外觀如何?

id status energy sun start  end   days 
1 ok  10  10 01/05/16 01/09/16 4 
1 ok  20  20 01/05/16 01/09/16 4 
1 ok  30  30 01/05/16 01/09/16 4 
1 finished 40  40 01/05/16 01/09/16 4 
2 ok  0  5 12/06/15 12/10/15 4 
2 failed 0  5 12/06/15 12/10/15 4 
3 ok  10  5 12/26/15 12/30/15 4 
3 ok  20  10 12/26/15 12/30/15 4 
3 ok  30  15 12/26/15 12/30/15 4 
3 finished 40  20 12/26/15 12/30/15 4 
4 ok  10  0 07/09/15 07/12/15 3 
4 ok  15  10 07/09/15 07/12/15 3 
4 failed 5  10 07/09/15 07/12/15 3 
5 ok  10  5 11/16/15 11/20/15 4 
5 ok  12  10 11/16/15 11/20/15 4 
5 ok  18  15 11/16/15 11/20/15 4 
5 failed 20  20 11/16/15 11/20/15 4 
6 ok  10  20 12/31/15 01/04/16 4 
6 ok  20  30 12/31/15 01/04/16 4 
6 ok  30  35 12/31/15 01/04/16 4 
6 finished 40  45 12/31/15 01/04/16 4 
+4

最好在帖子中問一個問題而不是多個問題。 – akrun

+1

你到目前爲止嘗試過什麼? – agstudy

+0

我認爲在解決方案中可能有共同的功能。這也是我堅持這種情況的原因。 – JohnnyDeer

回答

1

您希望將函數應用於按因子拆分的數據框(在您的案例中,爲id)。在base R中,您需要by()及其相關功能tapply()。假設d是您的數據:

d$days <- tapply(d$id, d$id, length)[d$id] 
d <- subset(d, days == 4) 
d <- do.call(rbind, 
    by(d, d$id, function(x) if ("finished" %in% x$status) x else NULL) 
)