对238列(df $ X1至df $ X238)重复相同的3个命令

时间:2019-06-24 21:15:55

标签: r loops command repeat simplify

您能帮我简化一下吗?我需要通过df $ X238对df $ X1重复238次:

df$X1[is.na(df$X1)] <- NA
df$X1[df$X1 == ‘N/A’] <- NA
df$X1[df$X1 == 0] <- NA

df$X2[is.na(df$X2)]<- NA
df$X2[df$X2 == ‘N/A’] <- NA
df$X2[df$X2 == 0] <- NA

...df$X238

2 个答案:

答案 0 :(得分:0)

正如瑞·巴拉达斯(Rui Barradas)指出的那样,第一个任务没有做任何事情。其余的可以这样处理:

df <- data.frame(
  X1 = c(0,1,3,NA),
  X2 = c(1, 'N/A', 3,3)
)

NA_subst <- function(x) {
  x[x == 'N/A'] <- NA
  x[x == 0] <- NA
  return(x)
}

as.data.frame(lapply(df, NA_subst))

答案 1 :(得分:0)

您的问题是关于不同的列,但您的示例涉及不同的对象。我会回答这两种情况,但首先是reproducible example

set.seed(123)
X <- data.frame(
  a = sample(c(0:2, NA, 'N/A'), 4),
  b = sample(c(0:2, NA, 'N/A'), 4)
)
X -> Y1 -> Y2

> X
     a   b
1    1 N/A
2 <NA>   0
3  N/A   1
4    2   2

对于数据框中的所有列:

X[X == 0 | X == 'N/A'] <- NA
# `is.na(x) <- NA` is redundant

> X
     a    b
1    1 <NA>
2 <NA> <NA>
3 <NA>    1
4    2    2

对于多个数据帧

如果相反,您需要在多个数据帧中重复操作,建议将其放在列表中:

df.list <- mget(objects(pattern = 'Y'))

> lapply(df.list, function(x) replace(x, x == 0 | x == 'N/A', NA))
$Y1
    a    b
1    1 <NA>
2 <NA> <NA>
3 <NA>    1
4    2    2

$Y2
    a    b
1    1 <NA>
2 <NA> <NA>
3 <NA>    1
4    2    2

如果您需要将列表转换回单个对象,则可以使用:

list2env(df.list, .GlobalEnv) # this will overwrite objects with same names