汇总和交叉制表数据的问题
Problems with aggregating and crosstabulating data
我的数据是这样的,大约 3300 行数据:
Year Location Catch
1991 0313 45100
1989 0711 323
1991 0312 1100
1991 0313 45100
1989 0711 323
1991 0312 400
1990 0313 101000
1981 0711 623
1999 0312 410
2000 0313 145100
1987 0711 323
1987 1285 770
....
年份涵盖 1977-2015 年期间,大约有 500 个不同的位置,并非每年都有数据。
我需要这样的输出,总结每个单元格的捕获量,按位置(行)和年份(列)制表:
Location '1977' '1978' '1979' '1980' '1981' '1982' '1983' ...
0312 456 11100 12560 320 4566 0 12010 ...
0313 121 100 4500 760 112 12050 100100 ...
0711 5500 6500 0 1205 1201 560 90500 ...
0712 325 215 600 10100 0 4500 11050 ...
1285 10005 2700 1900 101000 50 7500 6050 ...
... ... ... ... ... ... ... ...
我之前问过类似的问题,我也尝试过针对该问题成功建议的解决方案的不同版本,但没有成功。这有点不同,稍微复杂一些,我弄错了。
感谢您的帮助。
您可能可以使用 xtabs
实现您正在寻找的内容,它在下面为您在答案中发布的 table 按年份计算每个位置的总和。
xtabs(Catch ~ Location + Year, df)
Year
Location 1981 1987 1989 1990 1991 1999 2000
312 0 0 0 0 1500 410 0
313 0 0 0 101000 90200 0 145100
711 623 323 646 0 0 0 0
1285 0 770 0 0 0 0 0
数据
df <- read.table(header=TRUE, text="Year Location Catch
1991 0313 45100
1989 0711 323
1991 0312 1100
1991 0313 45100
1989 0711 323
1991 0312 400
1990 0313 101000
1981 0711 623
1999 0312 410
2000 0313 145100
1987 0711 323
1987 1285 770 ")
这里有一个tidyverse
方法。按'Year'、'Location'分组后,得到'Catch'的sum
,然后spread
从'long'到'wide'格式
library(tidyverse)
df %>%
group_by(Year, Location) %>%
summarise(Catch = sum(Catch)) %>%
spread(Year, Catch, fill = 0)
# A tibble: 4 × 8
# Location `1981` `1987` `1989` `1990` `1991` `1999` `2000`
#* <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 312 0 0 0 0 1500 410 0
#2 313 0 0 0 101000 90200 0 145100
#3 711 623 323 646 0 0 0 0
#4 1285 0 770 0 0 0 0 0
我的数据是这样的,大约 3300 行数据:
Year Location Catch
1991 0313 45100
1989 0711 323
1991 0312 1100
1991 0313 45100
1989 0711 323
1991 0312 400
1990 0313 101000
1981 0711 623
1999 0312 410
2000 0313 145100
1987 0711 323
1987 1285 770
....
年份涵盖 1977-2015 年期间,大约有 500 个不同的位置,并非每年都有数据。
我需要这样的输出,总结每个单元格的捕获量,按位置(行)和年份(列)制表:
Location '1977' '1978' '1979' '1980' '1981' '1982' '1983' ...
0312 456 11100 12560 320 4566 0 12010 ...
0313 121 100 4500 760 112 12050 100100 ...
0711 5500 6500 0 1205 1201 560 90500 ...
0712 325 215 600 10100 0 4500 11050 ...
1285 10005 2700 1900 101000 50 7500 6050 ...
... ... ... ... ... ... ... ...
我之前问过类似的问题,我也尝试过针对该问题成功建议的解决方案的不同版本,但没有成功。这有点不同,稍微复杂一些,我弄错了。
感谢您的帮助。
您可能可以使用 xtabs
实现您正在寻找的内容,它在下面为您在答案中发布的 table 按年份计算每个位置的总和。
xtabs(Catch ~ Location + Year, df)
Year
Location 1981 1987 1989 1990 1991 1999 2000
312 0 0 0 0 1500 410 0
313 0 0 0 101000 90200 0 145100
711 623 323 646 0 0 0 0
1285 0 770 0 0 0 0 0
数据
df <- read.table(header=TRUE, text="Year Location Catch
1991 0313 45100
1989 0711 323
1991 0312 1100
1991 0313 45100
1989 0711 323
1991 0312 400
1990 0313 101000
1981 0711 623
1999 0312 410
2000 0313 145100
1987 0711 323
1987 1285 770 ")
这里有一个tidyverse
方法。按'Year'、'Location'分组后,得到'Catch'的sum
,然后spread
从'long'到'wide'格式
library(tidyverse)
df %>%
group_by(Year, Location) %>%
summarise(Catch = sum(Catch)) %>%
spread(Year, Catch, fill = 0)
# A tibble: 4 × 8
# Location `1981` `1987` `1989` `1990` `1991` `1999` `2000`
#* <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 312 0 0 0 0 1500 410 0
#2 313 0 0 0 101000 90200 0 145100
#3 711 623 323 646 0 0 0 0
#4 1285 0 770 0 0 0 0 0