【问题标题】:Filtering specific column in list of dataframes with map by index in R在R中按索引过滤数据框列表中的特定列
【发布时间】:2020-12-01 10:36:04
【问题描述】:

我有一个数据框列表(测试),其中一列以“total_”(数字)开头,一列带有名称,一列保存年份。 我想查找在某一特定年份缺少总数但在下一个年份存在的案例(名称)。

我尝试了 str_detec(names) 和 contains(),尝试使用列索引来处理具有“总计”的列,尝试按年份过滤它,并尝试使用 is.na() 来查找缺失值,但我不能想办法。

lapply(test, function(x) filter(x[[x]][,1], is.na(.) & year == 1820))

map(test, ~filter(.x, sum(is.na(.x)), year == 1820))

map(test, ~filter_at(.x, sum(is.na(starts_with("total")))))

我只是想不通如何通过多个条件按索引进行过滤,然后使用 map 或 lapply。

呃,非常糟糕的例子:(我知道这只是相同数据帧的三倍,但它应该可以解决问题)。

year <- c(1820, 1821, 1822)
names <- c("A", "B", "C")

df <- data.frame(year, names)
df <- expand(df, year, names)

df$total_1 <- c(NA, 1,2, 1,2,3, NA, 2,3)

l <- list(df, df, df)

这就是我想要的

[[1]]
# A tibble: 9 x 3
   year names total_1
  <dbl> <chr>   <dbl>
1  1820 A          NA
7  1822 A          NA

[[2]]
# A tibble: 9 x 3
   year names total_1
  <dbl> <chr>   <dbl>
1  1820 A          NA
7  1822 A          NA

[[3]]
# A tibble: 9 x 3
   year names total_1
  <dbl> <chr>   <dbl>
1  1820 A          NA
7  1822 A          NA

【问题讨论】:

  • 你能分享一个可重现的例子和预期的输出吗?这样会更容易帮助你。

标签: r list dataframe lapply


【解决方案1】:

所以你不能直接使用列名total_1,因为它可以是包含'total'这个词的任何东西?

也许这样的帮助?

library(dplyr)
library(purrr)

map(l, ~.x %>% filter(if_any(contains('total'), ~is.na(.) & lead(!is.na(.)))))

#[[1]]
# A tibble: 2 x 3
#   year names total_1
#  <dbl> <chr>   <dbl>
#1  1820 A          NA
#2  1822 A          NA

#[[2]]
# A tibble: 2 x 3
#   year names total_1
#  <dbl> <chr>   <dbl>
#1  1820 A          NA
#2  1822 A          NA

#[[3]]
# A tibble: 2 x 3
#   year names total_1
#  <dbl> <chr>   <dbl>
#1  1820 A          NA
#2  1822 A          NA

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 2018-04-04
    • 1970-01-01
    • 2018-06-24
    • 2017-07-28
    • 2021-07-23
    • 1970-01-01
    相关资源
    最近更新 更多