【问题标题】:Conditional and grouped summaries by week dplyr按周 dplyr 的条件和分组摘要
【发布时间】: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))
  • 如果给定的draweryearweek 缺少一行,您可以使用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


【解决方案1】:

答案与上一个非常相似,但按drawerweek 分组,@eipi10 评论也是一个不错的选择;您可以通过在subset 之后使用索引来处理特定drawerweek 的缺失年份,这会将长度为零的对象变为NA:

例如:

df %>% 
    group_by(drawer, week) %>% 
    summarise(growth = +(sock_total[year==1991][1] - sock_total[year==1990][1] > 0))
#                                              ^^^                         ^^^
# A tibble: 15 x 3
# Groups:   drawer [?]
#   drawer  week growth
#    <int> <int>  <int>
# 1      1     1      1
# 2      1     2      0
# 3      1     3      0
# 4      1     4      0
# 5      1     5      0
# 6      2     1      0
# 7      2     2      1
# 8      2     3      1
# 9      2     4      1
#10      2     5      1
#11      3     1      0
#12      3     2      0
#13      3     3      0
#14      3     4      0
#15      3     5     NA

抽屉 3 和第 5 周的数据省略了 1991 年:

structure(list(year = c(1990L, 1990L, 1990L, 1990L, 1990L, 1990L, 
1990L, 1990L, 1990L, 1990L, 1990L, 1990L, 1990L, 1990L, 1990L, 
1991L, 1991L, 1991L, 1991L, 1991L, 1991L, 1991L, 1991L, 1991L, 
1991L, 1991L, 1991L, 1991L, 1991L), drawer = c(1L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L), week = c(1L, 2L, 3L, 4L, 
5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 
1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L), sock_total = c(3L, 4L, 3L, 
2L, 4L, 1L, 1L, 1L, 1L, 2L, 3L, 4L, 4L, 4L, 4L, 4L, 3L, 2L, 2L, 
3L, 1L, 3L, 4L, 4L, 3L, 2L, 3L, 3L, 2L)), .Names = c("year", 
"drawer", "week", "sock_total"), class = "data.frame", row.names = c(NA, 
-29L))

【讨论】:

    【解决方案2】:

    或者你也可以不使用complete 试试这个。

    df%>%group_by(drawer,week)%>%
         summarise(growth =ifelse(n()<=1,0,ifelse((sock_total[1]-sock_total[2])>=0,0,1)))
    
    
    
    # A tibble: 15 x 3
    # Groups:   drawer [?]
       drawer  week growth
        <int> <int>  <dbl>
     1      1     1      1
     2      1     2      0
     3      1     3      0
     4      1     4      0
     5      1     5      0
     6      2     1      0
     7      2     2      1
     8      2     3      1
     9      2     4      1
    10      2     5      1
    11      3     1      0
    12      3     2      0
    13      3     3      0
    14      3     4      0
    15      3     5      0
    

    【讨论】:

      猜你喜欢
      • 2017-06-26
      • 1970-01-01
      • 2021-10-25
      • 1970-01-01
      • 2012-03-12
      • 1970-01-01
      • 1970-01-01
      • 2018-07-12
      • 2020-09-16
      相关资源
      最近更新 更多