【问题标题】:Repeating same 3 commands for 238 columns, df$X1 through df$X238 [duplicate]对 238 列重复相同的 3 个命令,df$X1 到 df$X238 [重复]
【发布时间】:2019-06-24 21:15:55
【问题描述】:

你能帮我简化一下吗?我需要对 df$X1 到 df$X238 重复 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

【问题讨论】:

  • 你拥有的是同一个数据框中的不同列还是不同的数据框(即多个对象)?
  • X1[is.na(X1)] &lt;- NA 什么都不做,is.na(X1) 已经是TRUE
  • 您好,谢谢 Rui Barradas 和 Carlos Eduardo Lagosta。我刚刚更新它以显示它们是同一数据框中的不同列。我为混乱道歉。 X1 和 X2 应该是 df$X1 和 df$X2。这会改变事情吗?

标签: r loops command repeat simplify


【解决方案1】:

正如 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))

【讨论】:

  • 您好,Eastclintw00d。谢谢你。现在我更改了代码,这仍然适用吗?刚刚更新它以显示它们是同一数据框中的不同列。我为混乱道歉。 X1 和 X2 应该是 df$X1 和 df$X2
  • 是的,它应该仍然可以正常工作。
  • 道歉,因为我是新人。鉴于我的更改,您是否有机会提供新代码?看来我仍然必须在代码的第一部分列出 d​​f$X1 到 df$X238。
  • 我认为您无需更改任何内容。 data.frame 只是 list 的一种特殊类型。因此,当您有一个包含任意列数的数据框 df 时,上面的代码应该仍然有效。
【解决方案2】:

您的问题是关于不同的列,但您的示例涉及不同的对象。我会回答这两种情况,但首先是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

对于多个数据帧

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-20
    • 2023-03-03
    • 2021-10-16
    • 2020-02-07
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    相关资源
    最近更新 更多