在数据集中的组上循环进行for循环

时间:2019-02-13 19:48:12

标签: r for-loop group-by

我正在尝试将for循环应用于数据集。该循环应该为一定数量(不相等)的行生成一个序列,然后重新开始。我可以将这些行分组。我已经设法编写了一个循环,该循环适用于我的第一个组,但是随后停止了(还会引发一堆警告,“数值表达式有226个元素:仅第一个使用”)。我得到的是,它只是在第一组上进行迭代,但是组成此循环创建的新变量im的值改变了,并且崩溃了。谁能帮我? 很抱歉,我无法重新创建数据集!

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))

2 个答案:

答案 0 :(得分:2)

我想这就是你想要的:

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的定义明确,{{1} }不是,并且警告告诉您仅使用了每侧的第一个元素。这就是为什么我在答案中使用c(1901, 1901, 1901):c(1905, 1905, 1905)的原因。 在每个组中,我们只需要考虑前start[1]:end[1]start个值即可生成完整的end序列。 (您的尝试还存在这样的问题,即它实际上并没有对组执行任何操作--- year使分组变得容易。)

答案 1 :(得分:0)

另一种选择是通过map2(从purrr开始,依次循环到'start','end'的相应元素,在list中获得序列,然后在{{1}中进行}

unnest