如何使用 summarize 和 group by 在 r 中创建摘要 table?
How to use summarize and group by to create a summary table in r?
所以我有以下数据集(这是一个很小的 sample/example 它看起来像的数据集,原始数据集在 7 个十年内有 7000 行和 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
我想创建一个摘要 table 来指示每个变量的位置有多少年的可用数据。所以这样的事情会起作用(对于之前的小例子):
Location,Population Total, Median Age, Household Total
Adak,1,2,2
Akiachak,2,0,2
Rainfall,1,0,1
Tioga,1,0,0
我是 R 的新手,没有同时使用过这两个命令,所以我不确定语法。任何帮助都会很棒或替代品。
你可以这样做:
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 以获得更通用的解决方案。
来自 dplyr
的 summarize_all
的解决方案:
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)
所以我有以下数据集(这是一个很小的 sample/example 它看起来像的数据集,原始数据集在 7 个十年内有 7000 行和 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
我想创建一个摘要 table 来指示每个变量的位置有多少年的可用数据。所以这样的事情会起作用(对于之前的小例子):
Location,Population Total, Median Age, Household Total
Adak,1,2,2
Akiachak,2,0,2
Rainfall,1,0,1
Tioga,1,0,0
我是 R 的新手,没有同时使用过这两个命令,所以我不确定语法。任何帮助都会很棒或替代品。
你可以这样做:
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 以获得更通用的解决方案。
来自 dplyr
的 summarize_all
的解决方案:
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)