2014-12-04 110 views
1

謝謝你的時間。我有以下數據(片段)。它從縱向數據,改造成一個寬幅文件的工作狀態,每個柱子代表一個月,每一行都是一個人。如何用DF中的if-else替換幾個NA中的值?

Code: 
j1992_12 = c(1, 10, 1, 7, 1, 1) 
j1993_01 = c(1, 1, 1, NA, 3, 1) 
j1993_02 = c(1, 1, 1, NA, 3, 1) 
j1993_03 = c(1, 8, 1, NA, 3, 1) 
j1993_04 = c(1, 8, 1, NA, 3, 1) 
j1993_05 = c(1, 8, 1, NA, 3, 1) 
j1993_06 = c(1, 8, 1, NA, 3, 1) 
j1993_07 = c(1, 8, 1, NA, 3, 1) 
j1993_08 = c(1, 8, 1, NA, 3, 1) 
j1993_09 = c(1, 8, 1, NA, 3, 1) 
j1993_10 = c(1, 8, 1, NA, 3, 1) 
j1993_11 = c(1, 8, 1, NA, 3, 1) 
j1993_12 = c(1, 8, 1, NA, 3, 1) 
j1994_01 = c(1, 8, 1, 7, 3, 1) 


DF93= data.frame(j1992_12, j1993_01, j1993_02, j1993_03, j1993_04, j1993_05, j1993_06, j1993_07, j1993_08, j1993_09, j1993_10, j1993_11, j1993_12, j1994_01) 


Output: 
     j1992_12 j1993_01 j1993_02 j1993_03 j1993_04 j1993_05 j1993_06 j1993_07 j1993_08 j1993_09 j1993_10 j1993_11 j1993_12 j1994_01 
    R1  1   1  1  1  1  1  1  1  1  1  1  1  1  1 
    R2  10   1  1  8  8  8  8  8  8  8  8  8  8  8 
    R3  1   1  1  1  1  1  1  1  1  1  1  1  1  1 
    R4  7   NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  7 
    R5  1   3  3  3  3  3  3  3  3  3  3  3  3  3 
    R6  1   1  1  1  1  1  1  1  1  1  1  1  1  1 

我的願望是檢查12個月出現的「NA」,如R4行。然後,我想檢查一年前的最後一次發生(j1992_12)是否與下一年的第一次發生((j1994_01))具有相同的值。如果是,我認爲工作狀態沒有變化,因此全部12幾個月應該得到的值,即前一年的最後一個月給出。如果不是,都應該留不變

方法至今:。

DF93_2 = DF93 
DF93_2[,2:13] <- ifelse (is.na(DF93[,2:13]) && (DF93[,1]==DF93[,14]), DF93[,1] , DF93[,2:13]) 

現在我明白,如果我嘗試它只有一個像下面的代碼一樣的柱子,它取代了整個柱子。如何教R代替rowwise?

DF93_2[,2] <- ifelse (is.na(DF93[,2:13]) && (DF93[,1]==DF93[,14]), DF93[,1] , DF93[,2]) 

如果有人可以請給我一個暗示,我對R的理解有缺陷,我會非常感激。

編輯!只有原始文件是縱向的,這種格式現在是WIDE,我需要進行時間序列分析。它已經與所有年份(18年,從1992年開始到2010年)的調查數據進行了交叉檢查,所以我寧願不轉換成長格式,我正在尋找具有上述條件的可能性,我可以調整因爲條件不同。

經過進一步測試,我認爲問題在於連續搜索12個隨後的NA。我無法找到解決方案。如果您有任何想法,請分享。謝謝!

+0

我無法使用R其中,我所以它只是一種猜測,但我不知道,你可以在'ifelse'子句中使用布爾向量。你不只是得到它的第一個價值嗎? (例如'if(c(T,F)&& c(T,T))'給出if(T)') – Vincent 2014-12-04 16:28:45

+0

我不確定我理解。你是否想要做最後的觀察(http://en.wikipedia.org/wiki/Analysis_of_clinical_trials#Last_observation_carried_forward)?請參閱http://stackoverflow.com/questions/2776135/last-observation-carried-forward-in-a-data-frame – 2014-12-04 16:36:24

+0

12個月是否需要連續並在同一日曆年,這是否需要爲所有年份?總的來說,這讓我感到更好地處理了一個長問題,其中包括年份列,月份列,個人列和價值列。很多好的工具可以處理這類數據。 – farnsy 2014-12-04 16:41:57

回答

0
EWAZ99_2[,15:26] <- ifelse (is.na(EWAZ99[,15:26]) & (EWAZ99[,14]==EWAZ99[,27]), EWAZ99[,14] , EWAZ99[,15:26]) 

我想這就是你要找的。

+0

不幸的是,它對結果沒有任何影響(與我在問題中的代碼行相同)。第26行在1993年1月12日和以前一樣有12個NA。 – 2014-12-05 09:57:48

+0

你可以分享這裏提到的數據集,因爲我構建的虛擬數據框用來測試它是否給出了合適的結果。 – anonR 2014-12-05 12:48:01

+0

可悲的是它不起作用。如果只有一個「&」,則有72個「變量指示要替換12個變量」,否則沒有變化 - 我已經重寫了這個問題。 – 2014-12-06 15:32:10

0

不知道如果我理解你的權利,做這樣的幫助嗎?

naAction <- function(x) { 
    if (any(is.na(x))) { 
    if (x[1] == x[length(x)]) { 
     x[is.na(x)] <- x[1] 
    } 
    } 
    x 
} 


apply(DF93, 2, naAction) 
0

這裏有一種方法:

as.data.frame(t(apply(DF93, 1, function(x) 
    if(x[1] == tail(x, 1) && all(is.na(head(x, -1)[-1]))) 
    replace(x, is.na(x), x[1]) else x))) 
+0

這與樣本日期一致。我如何將它應用於較大的DF?我不完全理解「all(is.na(head(x,-1)[ - 1]」)部分。如果行中有其他NA,它是不是停止工作? 迄今爲止感謝。 – 2014-12-08 09:50:46

+0

@ R.bitrary它也應該適用於更大的數據框架。具體的問題是什麼? – 2014-12-08 10:55:19

+0

我該如何處理這個問題,它應該查找案例,在某一行的某一部分只有錯誤,例如專欄15:26,27:38,39:40等 - 我嘗試用all(is.na(x [15())替換「all(is.na(head(x,-1)[ - 1]))) :26))))**這是因爲樣本數據**有效,但使用更大的DF(377行,117個變量)我只是得到錯誤「缺少值,其中需要TRUE/FALSE」注意:NA使25% DF,意味着if(x [1])條件也可以達到缺失值 – 2014-12-08 12:08:12