使用dplyr complete()基于最小/最大值创建新变量

4

编辑:虽然这个问题已经关闭,但值得注意的是,提供的答案使用了一个与2012年原始问题完全不同的方法(使用dplyr)。这些新的答案可能对不同的用户有所帮助。

我有一个包含站点运营最小和最大年份的数据集。但是我想展开这个数据集,使每个站点的运营年份都有一行。

例如:

set.seed(42)
df <- data.frame(
  site = rep(LETTERS[1:10]),
  minY = sample(1980:1990, 10),
  maxY = sample(2000:2010, 10)
)
df
   site minY maxY
1     A 1980 2007
2     B 1984 2006
3     C 1990 2003
4     D 1988 2000
5     E 1981 2004
6     F 1983 2005
7     G 1986 2008
8     H 1989 2001
9     I 1987 2009
10    J 1985 2010

所以在我的最终数据集中,站点A将有28行(每年一行)。

我一直在尝试使用complete函数,但是我一直收到一个错误消息:

complete(df,
         nesting(site),
         fill = list(value1 = minY, value2 = maxY))
Error in vec_is_list(replace) : object 'minY' not found

请同时添加所需的输出。Output: 输出: - Ed_Gravy
2个回答

4
也许对您有用的是使用dplyrsummarize函数。
library(dplyr)

df %>% 
  rowwise() %>% 
  summarize(site, year = seq(minY, maxY, 1))
# A tibble: 210 × 2
   site   year
   <chr> <dbl>
 1 A      1980
 2 A      1981
 3 A      1982
 4 A      1983
 5 A      1984
 6 A      1985
 7 A      1986
 8 A      1987
 9 A      1988
10 A      1989
# … with 200 more rows

2
您可以使用tidyr :: uncount()按权重创建副本。在您的情况下,根据年份差异添加行可以像这样完成。
df |>
  uncount(weights = maxY - minY + 1)

如果您想添加一个唯一年份的列,可以使用dplyr::mutate()函数进行添加。

df |>
  uncount(weights = maxY - minY + 1) |>
  group_by(site) |>
  mutate(unique_year = seq.default(min(minY),max(maxY)))

这将导致一个data.frame,其行数根据maxYminY之间唯一的年份而定,并带有包含这些唯一年份的列。

1
我刚刚在这个问题的主线程中发布了完全相同的答案。在我看来,你的帖子似乎是先发的,所以如果你想在那里发布它,请告诉我,我会删除我的帖子 :) - tmfmnk
@FactOREO,我无法让这个解决方案起作用。我假设你的 |> 是一个管道符号(我使用 %>%),所以我修改了你的代码,并得到了以下错误:Error in View: 对类“NULL”的对象应用'mutate'方法不适用。 - tnt
1
@tnt |> 是基本的 R 管道,如果我没记错的话,它可用于 R 4.1 及以上版本。它基本上是将 f(g(x)) 写成 x |> g() |> f() 的更方便的方式,但在某些功能上缺少 magittr 管道 %>%(例如永久占位符“.”,基本管道仅使用“_”作为命名参数,并且我认为仅在右侧下一个函数中使用,而不在从内部调用的其他函数中)。 - FactOREO
没关系,我只是在这里回答一两个问题,帮助其他寻求建议的人。 :) - FactOREO
感谢 @FactOREO,我以前没看过这个! - tnt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接