2

我有一些 R 数据帧,其中包含二进制数据(0,1),以表示对特定子量表项目的不正确和正确响应。参与者没有被问到所有问题,并且必须NA指出这些缺失的数据。年长的参与者从较晚的项目开始,并且NA没有询问早期项目。此外,大多数参与者没有完成评估,导致NA行尾出现许多 s。示例行如下:

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

我想将NA行开头的所有 s (如果它们存在)替换为,并将行末尾的 s 替换1为。NA0

所以上面将是 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

是否有一个现有的功能可以满足我的需求?如果没有,任何人都可以用简单的代码来帮助我吗?

4

1 回答 1

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
于 2012-11-19T18:19:49.270 回答