2015-04-15 148 views
2

嗨,這是我第一篇文章,以stackoverflow。我一直在試圖解決這個問題,但一直沒有能夠找出答案,也沒有找到其他職位回答這個問題。根據兩個條件用另一個數據框的值替換數據幀中的NaN

我需要用我的數據集中的缺失值替換另一個數據幀中的值;然而,在那裏它變得棘手的是,我需要匹配的值有與他們相關的另一個因素,但匹配的日期。

這是第一個數據幀的簡化版本:

> df1 
date  site  Value 
1991-07-08 A   22.5 
1991-07-09 A   NaN 
1992-07-13 B   23.1 
1992-07-14 A   NaN 
1993-07-07 B   27.3 

這裏是第二個數據幀的簡化版本:

> df2 
date  site   value 
1991-07-08 A   22.5 
1991-07-09 A   NaN 
1992-07-14 A   NaN 
1991-07-08 B   10.6 
1992-07-09 B   23 
1992-07-14 B   NaN 
1992-07-09 C   11.3 
1992-07-14 C   12.4 

我想要做的是什麼時,有一個缺失值對於A用B的值(具有相同的日期)替換它,並且如果B沒有值,則使用C的值(具有相同的日期)。因此,所產生的數據幀是這樣的:

> dfFIN 
date  site  Value 
1991-07-08 A   22.5 
1991-07-09 A   23 
1992-07-13 B   23.1 
1992-07-14 A   12.4 
1993-07-07 B   27.3 

這就是我來了這麼遠:

dfFIN<-replace(df1[which(df1$site=="A"),], 
      df1$value[which(df$value=="NaN")], 
      df2$value[which(df2$site=="B" &   
      df2$date==df1$date[which(df1$value=="NaN" & df1$site=="A")])]) 

不過,我得到了以下錯誤消息:

Error in [<-.data.frame(*tmp*, list, value = numeric(0)) : 
    missing values are not allowed in subscripted assignments of data frames 

我還沒有合併網站C.我不太確定該做什麼,並希望得到任何幫助。

+0

您需要使用'is.nan',而不是試圖'== 「南」' - 'NaN'是一個特殊值代表無限值。 – thelatemail

回答

0

歡迎來到SO!首先,你的問題似乎有點不確定,所以我繼續做了幾處改動。我開始有兩個數據幀:

df1 <- read.table(text = " 
date  site  Value 
1991-07-08 A   22.5 
1991-07-09 A   NaN 
1992-07-13 B   23.1 
1992-07-14 A   NaN 
1993-07-07 B   27.3 
", head = T) 
df2 <- read.table(text = " 
date  site   Value 
1991-07-08 A   22.5 
1991-07-09 A   NaN 
1992-07-14 A   NaN 
1991-07-08 B   10.6 
1991-07-09 B   23 
1992-07-14 B   NaN 
1992-07-09 C   11.3 
1992-07-14 C   12.4 
", head = T) 

更換NaN用更傳統NA:這是由長到寬幅(reshape2)投

df1$Value[is.nan(df1$Value)] <- NA 
df2$Value[is.nan(df2$Value)] <- NA 

合併(左加盟)的數據幀,所以這個日期作爲關鍵:

library(reshape2) 
dd1 <- dcast(df1, date ~ site) 
dd2 <- dcast(df2, date ~ site) 

dm <- merge(dd1, dd2, by = "date", all.x = TRUE, suffixes = c("", ".y")) 

dm看起來像這樣:

 date A B A.y B.y C 
1 1991-07-08 22.5 NA 22.5 10.6 NA 
2 1991-07-09 NA NA NA 23.0 NA 
3 1992-07-13 NA 23.1 NA NA NA 
4 1992-07-14 NA NA NA NA 12.4 
5 1993-07-07 NA 27.3 NA NA NA 

現在很容易用任何你想要的東西替換NA,而不需要打擾日期。我使用以下規則:如果缺少A,請使用B.y,如果還缺少B.y,請使用C

dm$A <- ifelse(is.na(dm$A), 
       ifelse(is.na(dm$B.y), 
         dm$C, dm$B.y), 
       dm$A) 

現在恢復原來的格式:

dfFin <- na.omit(melt(dm[, c("date", "A", "B")], id = "date", variable.name = "site")) 

     date site value 
1 1991-07-08 A 22.5 
2 1991-07-09 A 23.0 
4 1992-07-14 A 12.4 
8 1992-07-13 B 23.1 
10 1993-07-07 B 27.3 
+0

謝謝@tonytonov要跟進,說我有更多的網站比ABC和每個網站將有不同的替換網站,例如, 網站A將被替換B比C; 站點B將被C替換爲D; 網站E將被F替換爲G. 如何將if else語句更改爲更一般? – broch

+0

這將需要與「ifelse」不同的東西。我建議你再問一個涉及這個問題的問題。完成後,您可以通知我。 – tonytonov

相關問題