我有如下数据帧列表:
dat_1 <- data.frame(x = c("A", "B", "C", "D") %>% as.factor)
dat_2 <- data.frame(x = c("A", "B", "C", "D") %>% as.character)
dat <- list("dat_1" = dat_1, "dat_2" = dat_2)
一些列是因素,其他列是字符。我需要用NA替换列表中所有数据帧的任何“C”实例。我将如何完成?
我知道我可以使用以下代码来完成此操作,但如果可能的话,我想避免对列表中的每个数据帧进行硬编码:
dat[["dat_2"]][dat[["dat_2"]] == "C"] <- NA
最佳答案
首先,创建数据框的方式将导致数据框的列成为所有因素。我对您的代码进行了如下修改,以使第一个数据帧为factor,第二个数据帧为character。
dat_1 <- data.frame(x = c("A", "B", "C", "D"))
dat_2 <- data.frame(x = c("A", "B", "C", "D"), stringsAsFactors = FALSE)
dat <- list("dat_1" = dat_1, "dat_2" = dat_2)
我们可以使用以下代码将所有“C”替换为
NA
。dat2 <- lapply(dat, function(x){
x[] <- lapply(x, function(x) replace(x, x %in% "C", NA))
return(x)
})
dat2
# $dat_1
# x
# 1 A
# 2 B
# 3 <NA>
# 4 D
#
# $dat_2
# x
# 1 A
# 2 B
# 3 <NA>
# 4 D
该代码不会更改列类型。
lapply(dat2, function(x) sapply(x, class))
# $dat_1
# x
# "factor"
#
# $dat_2
# x
# "character"