【问题标题】:How do I use dataframe names as inputs for var in for loop (R language)?如何在 for 循环(R 语言)中使用数据框名称作为 var 的输入?
【发布时间】:2020-10-02 00:20:20
【问题描述】:

在 R 中,我定义了以下函数:

race_ethn_tab <- function(x) {
  x %>%
  group_by(RAC1P) %>%
  tally(wt = PWGTP) %>%
  print(n = 15) }

该函数只是为给定数据集生成加权计数,例如,race_ethn_tab(ca_pop_2000) 生成一个简单的 9 x 2 表:

1     Race 1 22322824
2     Race 2  2144044
3     Race 3   228817
4     Race 4     1827
5     Race 5    98823
6     Race 6  3722624
7     Race 7   116176
8     Race 8  3183821
9     Race 9  1268095

我必须对几个(大约 10 个不同的数据集)执行此操作,在这些数据集中,我更容易保持 dfs 的不同而不是 bind 它们并创建一个 year 变量。因此,我尝试使用for looppurrr::map() 来遍历我的dfs 列表。

这是我尝试过的:

    dfs_test <- as.list(as_tibble(ca_pop_2000), 
                        as_tibble(ca_pop_2001), 
                        as_tibble(ca_pop_2002), 
                        as_tibble(ca_pop_2003), 
                        as_tibble(ca_pop_2004))

# Attempt 1: Using for loop

    for (i in dfs_test) {
      race_ethn_tab(i)
    }

# Attempt 2: Using purrr::map

    race_ethn_outs <- map(dfs_test, race_ethn_tab)

两次尝试都告诉我 group_by 不能应用于 factor 对象,但我无法弄清楚为什么 dfs_test 中的元素被注册为因素,因为我强迫它们进入tibble 类。将不胜感激任何基于我的方法的提示或在这里可能有意义的替代方法。

【问题讨论】:

  • ca_pop_2000ca_pop_2001 等到底是什么?您的函数引用了RAC1P,但我在其他任何地方都看不到。如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。
  • 如果您使用list 而不是as.list,您的代码应该可以工作。查看as.list(as_tibble(mtcars), as_tibble(iris))list(as_tibble(mtcars), as_tibble(iris)) 的输出
  • 谢谢你,@RonakShah!成功了。

标签: r dplyr purrr


【解决方案1】:

来自@RonakShah,这正是我们所需要的:

如果您使用 list 而不是 as.list,您的代码应该可以工作。见输出 as.list(as_tibble(mtcars),as_tibble(iris))与列表(as_tibble(mtcars), as_tibble(iris)) – Ronak Shah 10 月 2 日 0:23

【讨论】:

    【解决方案2】:

    我们可以使用mget返回一个list的数据集,然后遍历list并应用函数

    dfs_test <- mget(paste0("ca_pop_", 2000:2004))
    

    如果我们使用ls,它也可以更通用

    dfs_test <- mget(ls(pattern = '^ca_pop_\\d{4}$'))
    map(dfs_test, race_ethn_tab)
    

    如果在全局环境中已经创建了 100 个对象而不是这样做,这会更容易

    list(ca_pop_2000, ca_pop_2001, .., ca_pop_2020)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      相关资源
      最近更新 更多