【问题标题】:Simple loop with subset and variable name assignment带有子集和变量名分配的简单循环
【发布时间】:2019-02-02 16:07:16
【问题描述】:

我实际上正在学习 R,但我不明白为什么这个简单的作业不起作用。我想使用 dplyr 包的过滤器功能按年份划分子集。经过几次尝试,这里有一个使用 gapminder 数据集的可重现示例。

我可以使用子集函数、lapply 甚至匿名函数来解决这个问题,但是在这里,我只想了解为什么这个特定的代码不起作用。

library(gapminder)
library(dplyr)

for (i in unique(gapminder$year)) {
paste0("gapminder", i) <- print(gapminder %>%
         filter(year == i))
}

有无打印,同样的问题

【问题讨论】:

  • 你的第二个例子不起作用,因为你有一个额外的右括号。
  • 哦,谢谢!那时问题的一半不是问题。我要编辑这个问题,没有人对额外括号问题感兴趣......
  • R 中没有这样的代码。如果不能在赋值函数的左侧使用粘贴,则不能。即R中没有像`paste0&lt;-`这样的功能,所以这是不可能的。您宁愿使用等效于&lt;-assign 函数。这可以通过assign(paste0("gapminder", i),gapminder %&gt;% filter(year == i)) 来完成。但这不是最好的方法。您可以使用年份split 您的数据。即split(gapminder,gapminder$year) 然后使用setNames 设置名称,然后通过唱list2env(...,.GlobalEnv) 列出环境。不过没必要

标签: r loops filter dplyr subset


【解决方案1】:

这是因为您的任务是分配给一个函数 (paste0)。

如果您删除该部分,它会打印每个过滤后的数据帧:

library(gapminder)
library(dplyr)

for (i in unique(gapminder$year)) {
  print(gapminder %>% filter(year == i))
}

您可以将每个分配给list,如下所示:

my_list <- list()

library(gapminder)
library(dplyr)

for (i in seq_along(unique(gapminder$year))) {
  year_filter <- unique(gapminder$year)[i] # each iteration we get another year
  my_list[[i]] <- gapminder %>% filter(year == year_filter)
  cat(paste0("gapminder", year_filter, " ")) # use cat if you want to print at each iteration
}

paste0 只是在转换为字符后连接向量。

【讨论】:

  • 我什至没有注意到我正在分配一个函数......谢谢你这就是我正在寻找的答案
【解决方案2】:

使用assign函数存储输出。

for (i in unique(gapminder$year)) 
{
    assign(paste0("gapminder", i),print(gapminder %>%filter(year == i)))
}

如果你想得到具体的输出,使用get函数。

out_i = get(paste0("gapminder", i))

【讨论】:

    猜你喜欢
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    • 2021-11-26
    • 2018-11-18
    相关资源
    最近更新 更多