【问题标题】:Problems with aggregating and crosstabulating data汇总和交叉制表数据的问题
【发布时间】:2017-03-21 15:05:23
【问题描述】:

我的数据是这样的,大约 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  ...
...          ...    ...    ...    ...    ...    ...    ...

我之前问过一个类似的问题,我已经尝试了针对该问题成功建议的解决方案的不同版本,但没有成功。这有点不同,而且稍微复杂一些,我弄错了。

感谢您的帮助。

【问题讨论】:

  • 你具体尝试了什么?
  • 所以reshape2::dcast(df, Location ~ Year, value.var = 'Catch' ,fun.aggregate = sum)?

标签: r aggregate crosstab


【解决方案1】:

您可能可以使用xtabs 来实现您正在寻找的东西,下面会为您在答案中发布的表格计算每个位置的总和。

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 ")

【讨论】:

    【解决方案2】:

    这是tidyverse 方式。按'Year'、'Location'分组后,得到'Catch'的sum,然后得到'long'到'wide'格式的spread

    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
    

    【讨论】:

      猜你喜欢
      • 2022-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-17
      • 1970-01-01
      • 2016-12-03
      相关资源
      最近更新 更多