【发布时间】:2017-07-30 00:18:37
【问题描述】:
复杂化之前的question,假设我有以下袜子数据。
>socks
year drawer week sock_total
1990 1 1 3
1990 1 2 4
1990 1 3 3
1990 1 4 2
1990 1 5 4
1990 2 1 1
1990 2 2 1
1990 2 3 1
1990 2 4 1
1990 2 5 2
1990 3 1 3
1990 3 2 4
1990 3 3 4
1990 3 4 4
1990 3 5 4
1991 1 1 4
1991 1 2 3
1991 1 3 2
1991 1 4 2
1991 1 5 3
1991 2 1 1
1991 2 2 3
1991 2 3 4
1991 2 4 4
1991 2 5 3
1991 3 1 2
1991 3 2 3
1991 3 3 3
1991 3 4 2
1991 3 5 3
如何在dplyr 中使用summarise 创建新变量
growth 等于 1,如果它们是第一年和第二年之间每周的增加 - 否则 0。数据应该是这样的
>socks
drawer week growth
1 1 1
1 2 0
1 3 0
1 4 0
1 5 0
2 1 0
2 2 1
2 3 1
2 4 1
2 5 1
3 1 0
3 2 0
3 3 0
3 4 0
3 5 0
此外,如果抽屉在某一年中没有对应的一周,您将如何处理数据。如果缺少一周,也可以添加 NA。
【问题讨论】:
-
socks %>% arrange(year) %>% group_by(drawer, week) %>% summarise(growth=ifelse(diff(sock_total) > 0, 1, 0)) -
如果给定的
drawer、year和week缺少一行,您可以使用tidyr中的complete将其添加回来(sock_total将用@ 填充987654337@ 用于这些添加的行,或者您可以使用fill参数将其设置为零):library(tidyr); socks %>% complete(year, nesting(drawer, week)) %>% arrange(year) %>% group_by(drawer, week) %>% summarise(growth=ifelse(diff(sock_total) > 0, 1, 0)) -
@eipi10 在具有类似结构的数据上,我收到错误
Error in summarise_impl(.data, dots) : Column "growth" must be length 1 (a summary value), not 0你知道为什么会这样吗?我使用了您的第一个解决方案。 -
@eipi10 我猜这是因为一些缺失值。第二个示例中的代码仍在运行。如果问题是缺少值,您的第二行应该可以解决问题。
标签: r dplyr group-summaries