首页 > 解决方案 > 如何替换数据框列表中的单个值

问题描述

我有一个数据框列表如下:

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

标签: rlistdataframe

解决方案


首先,您创建数据框的方式将导致数据框的列成为所有因素。我将您的代码修改如下,使第一个数据框成为因子,第二个数据框成为字符。

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" 

推荐阅读