用于填充具有相同类型的NA的列的函数

Omr*_*tia 17 r na dplyr

我有一个包含许多不同类型列的数据框.我想用相应类的NA替换每一列.

例如:

df = data_frame(x = c(1,2,3), y = c("a", "b", "c"))

df[, 1:2] <- NA
Run Code Online (Sandbox Code Playgroud)

产生一个包含两个逻辑列的数据框,而不是数字和字符.我知道我可以告诉R:

df[,1] = as.numeric(NA)
df[,2] = as.character(NA)
Run Code Online (Sandbox Code Playgroud)

但是,如何在所有可能类型的NA的所有列的循环中共同执行此操作?

dig*_*All 10

你可以使用这个"技巧":

df[1:nrow(df),1] <- NA
df[1:nrow(df),2] <- NA
Run Code Online (Sandbox Code Playgroud)

[1:nrow(df),]主要是告诉R键替换与列中的所有值NA并且以这种方式的逻辑NA替换其它值之前强制转换为原始类型的列的.

另外,如果你要替换很多列并且data_frame有很多行,我建议存储行索引并重用它们:

rowIdxs <- 1:nrow(df)
df[rowIdxs ,1] <- NA
df[rowIdxs ,2] <- NA
df[rowIdxs ,3] <- NA
...
Run Code Online (Sandbox Code Playgroud)

正如@RonakShah巧妙建议的那样,你也可以使用:

df[TRUE, 1] <- NA
df[TRUE, 2] <- NA
...
Run Code Online (Sandbox Code Playgroud)

正如@Cath所指出的,当您选择多个列时,这些方法仍然有效,例如:

df[TRUE, 1:3] <- NA
# or
df[1:nrow(df), 1:3] <- NA
Run Code Online (Sandbox Code Playgroud)

  • 为什么不直接`df [TRUE,1:2] < - NA`? (3认同)

Sot*_*tos 8

适用于所有列的另一种解决方案可以是指定非NA并用NA替换,即

df[!is.na(df)] <- NA
Run Code Online (Sandbox Code Playgroud)

这使,

# A tibble: 3 x 2
      x    y    
  <dbl> <chr>
1    NA <NA> 
2    NA <NA> 
3    NA <NA> 
Run Code Online (Sandbox Code Playgroud)


Cat*_*ath 5

另一种在保留变量类的同时更改所有列的方法:

df[] <- lapply(df, function(x) {type <- class(x); x <- NA; class(x) <- type; x})

df
# A tibble: 3 x 2
#      x y    
#  <dbl> <chr>
#1    NA <NA> 
#2    NA <NA> 
#3    NA <NA> 
Run Code Online (Sandbox Code Playgroud)

正如在评论中通知@digEmAll,还有另一种类似但更短的方式:

df[] <- lapply(df, function(x) as(NA,class(x)))
Run Code Online (Sandbox Code Playgroud)

  • `lapply(df,function(x)as(NA,class(x)))`应该有效 (2认同)
  • 另一个基本选项`df [] < - lapply(df,replace,TRUE,NA)` (2认同)