总结?计算基于另一列的列中的出现次数

tas*_*alk 4 r dplyr summarize

我相信这可能有一个简单的解决方案,但是我在描述我需要做的事情(以及要搜索的内容)时遇到了麻烦。我想我需要summarize功能。我的目标输出在最底部。

我正在尝试计算另一列中每个唯一值之间的值出现次数。这是一个df希望能说明我需要做的例子。

library(dplyr)

set.seed(1)
df <- tibble("name" = c(rep("dinah",2),rep("lucy",4),rep("sora",9)),
             "meal" = c(rep(c("chicken","beef","fish"),5)),
             "date" = seq(as.Date("1999/1/1"),as.Date("2000/1/1"),25),
             "num.wins" = sample(0:30)[1:15])
Run Code Online (Sandbox Code Playgroud)

除其他事项外,我正在尝试总结(汇总)每个姓名使用此数据提供的餐食类型。

df
# A tibble: 15 x 4
   name  meal    date       num.wins
   <chr> <chr>   <date>        <int>
 1 dinah chicken 1999-01-01        8
 2 dinah beef    1999-01-26       11
 3 lucy  fish    1999-02-20       16
 4 lucy  chicken 1999-03-17       25
 5 lucy  beef    1999-04-11        5
 6 lucy  fish    1999-05-06       23
 7 sora  chicken 1999-05-31       27
 8 sora  beef    1999-06-25       15
 9 sora  fish    1999-07-20       14
10 sora  chicken 1999-08-14        1
11 sora  beef    1999-09-08        4
12 sora  fish    1999-10-03        3
13 sora  chicken 1999-10-28       13
14 sora  beef    1999-11-22        6
15 sora  fish    1999-12-17       18
Run Code Online (Sandbox Code Playgroud)

以下是我感兴趣的其他计算的进步:

df %>% 
  group_by(name) %>% 
  summarise(count=n(),
            medianDate=median(date),
            life=(max(date)-min(date)),
            wins=sum(num.wins))

# A tibble: 3 x 5
  name  count medianDate life      wins
  <chr> <int> <date>     <time>   <int>
1 dinah     2 1999-01-13  25 days    19
2 lucy      4 1999-03-29  75 days    69
3 sora      9 1999-09-08 200 days   101
Run Code Online (Sandbox Code Playgroud)

我的目标是为每种食物添加一个额外的列,并在每行中显示该食物的总和,如下所示:

  name  count medianDate life      wins  chicken  beef  fish
1 dinah     2 1999-01-13  25 days    19        1     1     0
2 lucy      4 1999-03-29  75 days    69        1     1     2
3 sora      9 1999-09-08 200 days   101        3     3     3
Run Code Online (Sandbox Code Playgroud)

akr*_*run 5

table一种选择是将内部用作summariselistunnest然后spread将其设置为“宽”格式

library(tidyverse)
df %>% 
  group_by(name) %>%
  summarise(count=n(),
             medianDate=median(date),
             life=(max(date)-min(date)),
             wins=sum(num.wins),
             n = list(enframe(table(meal))) ) %>%
  unnest %>%
  spread(name1, value, fill = 0)
# A tibble: 3 x 8
#  name  count medianDate life      wins  beef chicken  fish
#  <chr> <int> <date>     <time>   <int> <dbl>   <dbl> <dbl>
#1 dinah     2 1999-01-13  25 days    19     1       1     0
#2 lucy      4 1999-03-29  75 days    69     1       1     2
#3 sora      9 1999-09-08 200 days   101     3       3     3
Run Code Online (Sandbox Code Playgroud)


Gre*_*gor 5

尽管年龄较大,并且可能在弃用路径上,reshape2::dcast但可以很好地做到这一点:

reshape2::dcast(df, name ~ meal)
#    name beef chicken fish
# 1 dinah    1       1    0
# 2  lucy    1       1    2
# 3  sora    3       3    3
Run Code Online (Sandbox Code Playgroud)

您可以将公式理解为rows ~ columns。默认情况下,它将使用length函数- 汇总列中的值,该函数给出您想要的内容,以及每个的计数。

这可以很容易地加入到您的摘要数据中:

df %>% 
  group_by(name) %>% 
  summarise(count=n(),
            medianDate=median(date),
            life=(max(date)-min(date)),
            wins=sum(num.wins)) %>%
  left_join(reshape2::dcast(df, name ~ meal))
# # A tibble: 3 x 8
#   name  count medianDate life      wins  beef chicken  fish
#   <chr> <int> <date>     <time>   <int> <int>   <int> <int>
# 1 dinah     2 1999-01-13  25 days    19     1       1     0
# 2 lucy      4 1999-03-29  75 days    69     1       1     2
# 3 sora      9 1999-09-08 200 days   101     3       3     3
Run Code Online (Sandbox Code Playgroud)