我有如下数据帧列表:

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"

10-04 22:23
查看更多