2014-12-04 52 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