我有一个包含许多不同类型列的数据框.我想用相应类的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)
适用于所有列的另一种解决方案可以是指定非NA并用NA替换,即
df[!is.na(df)] <- NA
Run Code Online (Sandbox Code Playgroud)
这使,
Run Code Online (Sandbox Code Playgroud)# A tibble: 3 x 2 x y <dbl> <chr> 1 NA <NA> 2 NA <NA> 3 NA <NA>
另一种在保留变量类的同时更改所有列的方法:
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)