2014-09-18 53 views
2

我想寫一點代碼,它會根據開始日期獲取數據框的一部分,每個開始日期對於每個用戶都是不同的。在R中設置基於變量開始日期的數據

假設我有以下data.frames(在現實中我的數據集是幅度大幾個數量級,但是這將足以作爲樣本集)

DF1:

> df 
     name start.date 
1 Allison 2013-03-16 
2 Andrew 2013-03-16 
3  Carl 2013-03-16 
4  Dora 2013-03-17 
5 Hilary 2013-03-17 
6 Louis 2013-03-18 
7  Mary 2013-03-19 
8 Mickey 2013-03-20 

而且DF2:

> df2 
     names X03.16.2013 X03.17.2013 X03.18.2013 X03.19.2013 
2001 Allison   5   5   0   0 
2002 Andrew   2   0   0   0 
2003 Carl   10   8   11   10 
2004 Dora   0   4   0   0 
2005 Hilary   0   3   5   0 
2006 Louis   0   0   8   3 
2007 Mary   0   0   0   7 
2008 Mickey   0   0   0   0 

我合併這兩個數據幀到一個名爲TMP:

>tmp 

    name start.date   X03.16.2013 X03.17.2013 X03.18.2013 X03.19.2013 
    1 Allison 2013-03-16   5   5   0   0 
    2 Andrew 2013-03-16   2   0   0   0 
    3  Carl 2013-03-16   10   8   11   10 
    4  Dora 2013-03-17   0   4   0   0 
    5 Hilary 2013-03-17   0   3   5   0 
    6 Louis 2013-03-18   0   0   8   3 
    7  Mary 2013-03-19   0   0   0   7 
    8 Mickey 2013-03-20   0   0   0   0 

我也有DF2的列名的列表轉換爲日期:

>dts 

[1] "2014-03-16" "2014-03-17" "2014-03-18" "2014-03-19" 

我認爲解決這個問題的方法是改變所有在DF2零個條目每個用戶的開始日期之前發生NA使用以下嵌套循環:

for (i in 1:dim(tmp)[1]){ 
    for (j in 1:length(dts)){ 
    for (z in 4:dim(tmp)[2]){ 
    if (dts[j]< tmp$Date.of.Sign.Up[i]){ 
     tmp[i,z]<-NA 
    } else {tmp[i,z]<-tmp[i,z]} 
    } 
} 
} 

該循環的問題是1.它將無限運行,並且2.不起作用。它將tmp中的所有值從tmp [,3:end]更改爲零,無論開始日期如何。理想情況下,我會結束這樣的事情:

 name start.date   X03.16.2013 X03.17.2013 X03.18.2013 X03.19.2013 
    Allison 2013-03-16   5   5   0   0 
    Andrew 2013-03-16   2   0   0   0 
    Carl 2013-03-16   10   8   11   10 
    Dora 2013-03-17   NA   4   0   0 
    Hilary 2013-03-17   NA   3   5   0 
    Louis 2013-03-18   NA   NA   8   3 
    Mary 2013-03-19   NA   NA   NA   7 
    Mickey 2013-03-20   NA   NA   NA   NA 

有什麼建議嗎?先謝謝你!

回答

0

您可能重塑「TMP」長格式,前者頭轉換成日期,他們開始日期進行比較,當「標題日期」後的開始日期發生插入NA

library(reshape2) 

# melt data from wide to long format 
df3 <- melt(tmp, id.vars = c("name", "start.date")) 

# convert 'variable' to class Date 
df3$variable <- as.Date(df3$variable, format = "X%m.%d.%Y") 

# compare start dates with 'variable dates' and insert NA 
df3$value[df3$start.date > df3$variable] <- NA 

# reshape back to wide 
dcast(df3, name + start.date ~ variable) 

#  name start.date 2013-03-16 2013-03-17 2013-03-18 2013-03-19 
# 1 Allison 2013-03-16   5   5   0   0 
# 2 Andrew 2013-03-16   2   0   0   0 
# 3 Carl 2013-03-16   10   8   11   10 
# 4 Dora 2013-03-17   NA   4   0   0 
# 5 Hilary 2013-03-17   NA   3   5   0 
# 6 Louis 2013-03-18   NA   NA   8   3 
# 7 Mary 2013-03-19   NA   NA   NA   7 
# 8 Mickey 2013-03-20   NA   NA   NA   NA 

另一個可能我們遍歷在 'TMP' 的 '日期列名':

dates <- names(tmp)[-c(1, 2)] 

tmp[ , -c(1, 2)] <- sapply(dates, function(x){ 
    date <- as.Date(x, format = "X%m.%d.%Y") 
    tmp[ , x][df2$start.date > date] <- NA 
    tmp[ , x] 
}) 

tmp 
#  name start.date X03.16.2013 X03.17.2013 X03.18.2013 X03.19.2013 
# 1 Allison 2013-03-16   5   5   0   0 
# 2 Andrew 2013-03-16   2   0   0   0 
# 3 Carl 2013-03-16   10   8   11   10 
# 4 Dora 2013-03-17   NA   4   0   0 
# 5 Hilary 2013-03-17   NA   3   5   0 
# 6 Louis 2013-03-18   NA   NA   8   3 
# 7 Mary 2013-03-19   NA   NA   NA   7 
# 8 Mickey 2013-03-20   NA   NA   NA   NA 
+0

當你寫的語句'DF3 < - 融(DF2,id.vars = C( 「名」, 「start.date」 )'你是不是要說'df3 < - melt(df,id.vars = c(「name」,「start.date」))' – Archimeow 2014-09-18 21:57:30

+0

對於第二種解決方案,我我沒有得到任何新加入。我不知道你是否提到df2你打算說tmp。我使用了下面的代碼兩次,一次假設你打算在所有你說的df2的地方說tmp,一次是這樣的:'dates < - names(tmp)[ - c(1,2,3)]' 'tmp [ (x,format =「X%m。%d。%Y」) tmp [,x ] [tmp $ Date.of.Sign.Up Archimeow 2014-09-18 22:40:26

+0

both times沒有NAs被插入 – Archimeow 2014-09-18 22:40:55

相關問題