【问题标题】:How to use summarize and group by to create a summary table in r?如何使用summary和group by在r中创建汇总表?
【发布时间】:2017-10-04 17:40:01
【问题描述】:

所以我有以下数据集(这是一个小样本/示例,原始数据是 70 年的 7k 行和 30 列):

Year,Location,Population Total, Median Age, Household Total
2000, Adak, 220, 45, 67
2000, Akiachak, 567, NA, 98
2000, Rainfall, 2, NA, 11
1990, Adak, NA, 33, 56
1990, Akiachak, 456, NA, 446
1990, Tioga, 446, NA, NA

我想创建一个汇总表,以指示每个变量按位置提供的数据年限。所以这样的事情会起作用(对于之前的小例子):

Location,Population Total, Median Age, Household Total
Adak,1,2,2
Akiachak,2,0,2
Rainfall,1,0,1
Tioga,1,0,0

我是 R 新手,没有同时使用这两个命令,所以我不确定语法。任何帮助都会很棒或替代品。

【问题讨论】:

  • 您需要使用dplyr 包。从group_by(Location) 开始,然后编写您的summarisecount 语句。不过,我建议查看有关使用 dplyr 的教程。
  • 此外,如果您提供您尝试过的方法的示例,您将在此处收到关于问题的更好反馈。照原样,有些人可能会将其解释为作业问题...
  • 谢谢!我正在考虑将所有不是 NA 的东西切换为 1,将 Na 切换为 0,然后在带走年份的同时聚合行。但是我的老板说我应该尝试同时使用这两个功能。
  • 您是在专门谈论dplyr 中的group_bysummarize 吗?如果是这样,您可能希望将dplyr 添加为标签

标签: r dataframe group-by dplyr summary


【解决方案1】:

summarize_all 来自dplyr 的解决方案:

library(dplyr)
df %>%
  group_by(Location) %>%
  summarize_all(funs(sum(!is.na(.)))) %>%
  select(-Year)

或者你可以使用summarize_at:

df %>%
  group_by(Location) %>%
  summarize_at(vars(-Year), funs(sum(!is.na(.))))

结果:

# A tibble: 4 x 4
   Location PopulationTotal MedianAge HouseholdTotal
      <chr>           <int>     <int>          <int>
1      Adak               1         2              2
2  Akiachak               2         0              2
3  Rainfall               1         0              1
4     Tioga               1         0              0

数据:

df = read.table(text = "Year,Location,PopulationTotal, MedianAge, HouseholdTotal
                2000, Adak, 220, 45, 67
                2000, Akiachak, 567, NA, 98
                2000, Rainfall, 2, NA, 11
                1990, Adak, NA, 33, 56
                1990, Akiachak, 456, NA, 446
                1990, Tioga, 446, NA, NA", header = TRUE, sep = ",", stringsAsFactors = FALSE)

library(dplyr)    
df = df %>%
  mutate_at(vars(PopulationTotal:HouseholdTotal), as.numeric)

【讨论】:

    【解决方案2】:

    你可以这样做:

    x %>%
      group_by(Location) %>%
      summarise(count_years = n(), 
                count_pop_total = sum(!is.na(Population_Total)),
                count_median_age = sum(!is.na(Median_Age)),
                count_house_total = sum(!is.na(Household_Total)))
    

    您可以将平均值替换为您想要执行的任何操作。您应该查看dplyr vignette 以获得更通用的解决方案。

    【讨论】:

    • 我更改了我的答案,以明确使用group_bysummarise 给出OP 想要的答案,但是@user 给出的答案summarize_allsummarize_at 可能更适合这种情况
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多