替换数据框列表中编号列的 NA

标签 r list replace na purrr

我有以下结构的大量数据框列表:

foo <- 1:5
lorem1968 <- c(6, NA, NA, 8, NA)
lorem1969 <- c(NA, 17, NA, 19, 20)
df1 <- data.frame(foo, lorem1968, lorem1969)

ipsum <- 11:15
lorem1970 <- c(22, NA, 24, NA, NA)
df2 <- data.frame(ipsum, lorem1969, lorem1970)

df.list <- list(df1, df2)

[[1]]
  foo lorem1968 lorem1969
1   1         6        NA
2   2        NA        17
3   3        NA        NA
4   4         8        19
5   5        NA        20

[[2]]
  ipsum lorem1969 lorem1970
1    11        NA        22
2    12        17        NA
3    13        NA        24
4    14        19        NA
5    15        20        NA

我现在想遍历所有名为 loremxxxx 的列并用 0 替换那里的所有 NA。然后,我想在每个 df 中创建一个新列,其中包含该特定 df 中包含的所有 loremxxxx 列的平均值。

问题是这些是原始数据中的重叠面板,因此任何 df1 都包含 lorem1968、lorem1969、lorem1970。 df2 包含 lorem1969、1970、1971。等等。

我试图选择这样的列:
lorem.cols <- purrr::map(panels.list, function(x)
  select(x, starts_with("lorem"))
  )

并且:
lorem.cols <- purrr::map(df.list, function(data)
  data %>% select(data, starts_with("lorem"))
)

但两者都抛出了一个错误,要么找不到函数,要么给我“选择:”并等待输入。刚刚尝试从 select() 的帮助页面复制功能。

在我计划像这样更换 NA 之后:
df.list <- purrr::map(df.list, function(data)
  data %>% mutate(lorem.cols = replace(is.na(lorem.cols), 0))
  )

谢谢你们!

最佳答案

这是一个 依赖于 data.table 的方法在 lapply() 中成立的按引用更新调用。

library(data.table)
lapply(df.list, setDT)

lapply(df.list,
       function(dt) {
         cols <- grep('^lorem', names(dt))
         setnafill(dt, fill = 0L, cols = cols)
         dt[, mean_lorem := rowMeans(.SD), .SDcols = cols]
         })
#> [[1]]
#>    foo lorem1968 lorem1969 mean_lorem
#> 1:   1         6         0        3.0
#> 2:   2         0        17        8.5
#> 3:   3         0         0        0.0
#> 4:   4         8        19       13.5
#> 5:   5         0        20       10.0
#> 
#> [[2]]
#>    ipsum lorem1969 lorem1970 mean_lorem
#> 1:    11         0        22       11.0
#> 2:    12        17         0        8.5
#> 3:    13         0        24       12.0
#> 4:    14        19         0        9.5
#> 5:    15        20         0       10.0

关于替换数据框列表中编号列的 NA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58783031/

相关文章:

mysql - 将数据框中的行存储在数据库中

java - list.toArray() 同意将 A 类型的项目传输到 B[] 类型的数组

java项目列表1到列表2

javascript - 删除脚本中的 HTML 标签

javascript - 删除特定字符,除非前面有某个特定字符串

jQuery 拉取没有美元符号的货币

r - 获取包含 R 中值列表的列中的汇总频率

Tweedie 复合泊松 Gamma 的 R 代码

r - 从 n 行的字符串中提取一个单词并将该单词附加为 R 中的新列

Haskell中的随机数列表