2012-11-19 24 views
2

我有包含二进制数据(0,1)表示对特定分量表项不正确,并正确反应几个R数据帧。与会者没有被问及所有问题,并有NA表示这一缺失数据。年龄较大的参与者从后面的项目开始,并且对于未提问的早期项目有NA。此外,大多数参与者没有完成在行的结束导致很多NA S中的评估。例如行如下:更换NA与取决于位置在第1行或0中的R

Row 1 = NA, NA, NA, 1, 1, 0 , 1, 0, 0, 0, NA, NA Row 2 = 1, 1, 0, 0, 0, NA, NA, NA, NA, NA, NA, NA, NA

我想在行的开头1NA s的行与0末更换所有NA S(如果存在的话)。

所以上面会 Row 1 = 1,1, 1, 1, 1, 0 , 1, 0, 0, 0, 0,0 Row 2 = 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0

我曾尝试使用下面的函数尝试:

datComp <- function (x){ 
    xmin <- min(which(!is.na(x))) 
    xmax <- max(which(!is.na(x))) 
    if (xmin >1){ 
    x[1:xmin-1] <- 1} 
    x[(xmax+1):length(x)] <- 0 
    return(x) 
    } 

,但得到这个错误,对一些数据帧:

Error in data.frame(`1` = c(1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, : 
    arguments imply differing number of rows: 36, 37 

有一个现有的功能,做我想要的?如果没有,任何人都可以用简单的代码来帮助我吗?

+2

如果您为示例行提供了预期的结果,这将会很有帮助。如果您提供了多个示例行来说明您正在处理的不同种类的行,这也会很有帮助。 – nograpes

+1

请参阅:【如何使一个伟大的可重复的例子(http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) –

回答

1

我不知道任何现有的功能,将做到这一点。以下是一种方法:

d <- read.csv(text="NA, NA, NA, 1, 1, 0 , 1, 0, 0, 0, NA, NA 
1, 1, 0, 0, 0, NA, NA", header=FALSE, strip.white=TRUE, fill=TRUE) 
# V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 
# 1 NA NA NA 1 1 0 1 0 0 0 NA NA 
# 2 1 1 0 0 0 NA NA NA NA NA NA NA 

t(# apply returns its results in column form, so we transpose here 
    apply(d, 
    MARGIN=1, # apply over the rows 
    FUN=function(row) # for value in row, if NA and index less than min non-NA index, 1, else 0 
      ifelse(is.na(row), 
      ifelse(seq_along(row) < which.min(is.na(row)), 1, 0), 
      row) 
) 
) 
#  V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 
# [1,] 1 1 1 1 1 0 1 0 0 0 0 0 
# [2,] 1 1 0 0 0 0 0 0 0 0 0 0 
+0

谢谢!像魅力一样工作。 – wmmurrah