2015-10-06 241 views
2

我試圖實現類似於thisthis問題的類似問題,但不是用單個值替換,而是基於另一列替換。R:用另一列中的值替換多列數據幀中的多個值

的數據是從具有特定的網站「是」的時候被採取的具體日期測量,我現在想的河上的那些特定日期的水位。我的數據看起來是這樣的(但有更多的地點和日期):

date <- c('2000-01-01','2000-01-02','2000-01-03','2000-01-04','2000-01-05','2000-01-06','2000-01-07','2000-01-08','2000-01-09','2000-01-10') 
date <- as.Date(date) 
Site1 <- c('yes','','yes','','yes','','yes','','','') 
Site2 <- c('yes','yes','yes','','','','','yes','','yes') 
Site3 <- c('','','','','','','yes','yes','','yes') 
waterlevel <- c(24,58,2,38,18,59,20,98,16,88) 
df <- data.frame(date,Site1,Site2,Site3,waterlevel) 

這給出了這樣的數據幀:

  date Site1 Site2 Site3 waterlevel 
1 2000-01-01 yes yes    24 
2 2000-01-02   yes    58 
3 2000-01-03 yes yes    2 
4 2000-01-04       38 
5 2000-01-05 yes      18 
6 2000-01-06       59 
7 2000-01-07 yes   yes   20 
8 2000-01-08   yes yes   98 
9 2000-01-09       16 
10 2000-01-10   yes yes   88 

,我想輸出數據框,看起來像這樣:

  date Site1 Site2 Site3 waterlevel 
1 2000-01-01 24 24    24 
2 2000-01-02  58    58 
3 2000-01-03 2 2    2 
4 2000-01-04      38 
5 2000-01-05 18     18 
6 2000-01-06      59 
7 2000-01-07 20   20  20 
8 2000-01-08   98 98  98 
9 2000-01-09      16 
10 2000-01-10   88 88  88 

我已經嘗試使用上述問題的解決方案代碼與一個不同的數據框中的水位匹配參數,但解決方案沒有工作:

sel <- grepl("Site",names(df)) 
df[sel] <- lapply(df[sel], function(x) replace(x,x %in% 2:4, df2$waterlevel[match(df$date,df2$date)])) 

任何幫助將非常感激。

回答

2

使用data.table包。在這裏更容易處理長格式和昏迷再次到寬格式(原始的)。

dcast(date+waterlevel~variable, ## put again in the wide format 
     data=melt(setDT(df),id=c("date","waterlevel"))[ ## long format 
     value=="yes",value:=waterlevel]) ## filter and process one variable 

     date waterlevel Site1 Site2 Site3 
1: 2000-01-01   24 24 24  
2: 2000-01-02   58   58  
3: 2000-01-03   2  2  2  
4: 2000-01-04   38     
5: 2000-01-05   18 18    
6: 2000-01-06   59     
7: 2000-01-07   20 20   20 
8: 2000-01-08   98   98 98 
9: 2000-01-09   16     
10: 2000-01-10   88   88 88 
2
df[sel] <- lapply(df[sel], 
        function(x, value) ifelse(x == "yes", value, NA), 
        value = df$waterlevel) 

#   date Site1 Site2 Site3 waterlevel 
#1 2000-01-01 24 24 NA   24 
#2 2000-01-02 NA 58 NA   58 
#3 2000-01-03  2  2 NA   2 
#4 2000-01-04 NA NA NA   38 
#5 2000-01-05 18 NA NA   18 
#6 2000-01-06 NA NA NA   59 
#7 2000-01-07 20 NA 20   20 
#8 2000-01-08 NA 98 98   98 
#9 2000-01-09 NA NA NA   16 
#10 2000-01-10 NA 88 88   88 
+0

@PierreLafortune爲什麼你想將這些列到類'character'? – Roland

+0

但是NA更有意義。 –

相關問題