【问题标题】:Iterating a for loop over groups in a dataset在数据集中的组上迭代 for 循环
【发布时间】:2019-02-13 19:48:11
【问题描述】:

我正在尝试将 for 循环应用于数据集。该循环应该为特定(不相等)的行数生成一个序列,然后重新开始。我可以对这些行进行分组。我设法编写了一个循环,该循环适用于我的第一个组,但随后停止(也抛出一堆警告,“数值表达式有 226 个元素:仅使用第一个元素”)。我知道它只是在第一组上进行迭代,但随后构成新变量的值我用这个循环创建了变化并且它崩溃了。谁能帮我? 我在重新创建数据集方面很糟糕,对不起!

start <- c(1901, 1902, 1950, 1980, 1980)
end <- c(1905, 1910, 1951, 1999, 1985)
year <- NA
group <- c("apples","apples","apples", "Banana","cherry")
df <- data.frame(start, end, year, group)
df$count <- df$end - df$start
df<- df[rep(rownames(df), df$count +1), ]

这是我的循环:

for(i in row_along(df)){
df$year[[i]] <- rep(df$start:df$end)[i]
}

我希望每一行在开始和结束之间都有一个“年份”值(对于每一年,一行具有相同的值,年份除外)。我的行数(开始日期和结束日期)不相等,具体取决于其他两个变量。 用 dplyr 分组不是问题,我可以设法制作一个数据帧列表(带有拆分),但仅此而已。我被困住了。

以防万一

row_along <- function(df) seq(nrow(df))

【问题讨论】:

    标签: r for-loop group-by


    【解决方案1】:

    我想这就是你想要的:

    library(dplyr)
    df %>% group_by(start, end) %>%
      mutate(year = start[1]:end[1])
    # # A tibble: 42 x 5
    # # Groups:   start, end [5]
    #    start   end  year group  count
    #    <dbl> <dbl> <int> <fct>  <dbl>
    #  1  1901  1905  1901 apples     4
    #  2  1901  1905  1902 apples     4
    #  3  1901  1905  1903 apples     4
    #  4  1901  1905  1904 apples     4
    #  5  1901  1905  1905 apples     4
    #  6  1902  1910  1902 apples     8
    #  7  1902  1910  1903 apples     8
    #  8  1902  1910  1904 apples     8
    #  9  1902  1910  1905 apples     8
    # 10  1902  1910  1906 apples     8
    # # ... with 32 more rows
    

    在您的尝试中,您有df$start:df$enddf$start 是一个向量,是所有起始值的整列,df$end 也是如此,这就是您收到警告的原因:1901:1905 定义明确,c(1901, 1901, 1901):c(1905, 1905, 1905) 没有定义,警告告诉你只使用每边的第一个元素。这就是我在答案中使用start[1]:end[1] 的原因。 在每个组内,我们只需要考虑第一个startend 值即可生成完整的year 序列。 (您的尝试还有一个问题,即它并没有真正对组做任何事情---dplyr 使分组变得容易。)

    【讨论】:

    • 是的。太感谢了!!如果它可以做得很复杂,为什么要尝试简单的方法呢?
    【解决方案2】:

    另一种选择是使用map2(来自purrr)遍历'start'、'end'的相应元素,获取list中的序列,然后unnest

    library(tidyverse)
    df %>% 
        mutate(year = map2(start, end, `:`)) %>% 
        unnest
    

    【讨论】:

      猜你喜欢
      • 2018-03-01
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 2015-07-25
      • 1970-01-01
      • 2019-11-10
      • 2017-05-05
      • 2016-11-12
      相关资源
      最近更新 更多