【问题标题】:Subtracting movement between units over time随着时间的推移减去单位之间的移动
【发布时间】:2019-11-27 14:29:06
【问题描述】:

这是我的查询,因为我还没有找到合适的答案.. 我有一个数据集,它描述了 13 年内在不同丹麦城市之间流动的总人数的所有组合。

我想要的是一年中所有城市组合之间的移动总和。

见下面的代码:

library("tidyverse")
library("statsDK")


# GETTING DATA FROM DANISH ARCHIVES
fly66_0 <- retrieve_data("FLY66", ALDER = "0")
fly66_1 <- retrieve_data("FLY66", ALDER = "1")
fly66_2 <- retrieve_data("FLY66", ALDER = "2")
fly66_3 <- retrieve_data("FLY66", ALDER = "3")
fly66_4 <- retrieve_data("FLY66", ALDER = "4")
fly66_5 <- retrieve_data("FLY66", ALDER = "5")

fly_66 <- rbind(fly66_0, fly66_1, fly66_2, fly66_3, fly66_4, fly66_5)

fly_66 <- fly_66 %>%
  group_by(TO_muni, FROM_muni, YEAR) %>%
  summarise(Number = sum(Number))

这会产生下表(我已将列名更改为英文):

# A tibble: 6 x 4
# Groups:   TILKOMMUNE, FRAKOMMUNE [3]
  TO_muni    FROM_muni    YEAR    Number
  <chr>       <chr>      <dbl>   <dbl>
1 101         202       2006       1
2 101         202       2007       3
3 202         101       2006       2
4 202         101       2007       3
5 101         303       2006       2
6 303         101       2007       1

但我想要的是这样的:

# A tibble: 6 x 4
# Groups:   TILKOMMUNE, FRAKOMMUNE [3]
  TO_muni    FROM_muni    YEAR    Number
  <chr>       <chr>      <dbl>   <dbl>
1 101         202       2006      -1
2 101         202       2007       0
3 202         101       2006       1
4 202         101       2007       0
5 101         303       2006       2
6 303         101       2006      -2
5 101         303       2007      -1
6 303         101       2007       1

我尝试了以下方法,但我无法理解它:

library("reshape2")
fly_66 <- fly_66 %>% 
  dcast(TO_muni + YEAR ~ FROM_muni, value.var = "YEAR", fill = 0)

希望它有意义,并在此先感谢。

【问题讨论】:

  • 不用reshape,用dplyr group函数总结一下即可。
  • 我无法获取您的statsDK 库,但我认为这应该很容易解决。您可以复制您的数据集并将TO_muniFROM_muni 的名称颠倒过来。然后full_join原件和副本,最后用mutate计算差值。

标签: r dplyr subtraction


【解决方案1】:

并不简单,但您可以分 3 步完成

开始于: fly_66 &lt;- rbind(fly66_0, fly66_1, fly66_2, fly66_3, fly66_4, fly66_5)

你首先得到你的实际输出:

fly_66a <- fly_66 %>%
  group_by(TO_muni, FROM_muni, YEAR) %>%
  summarise(Number = sum(Number))

然后你为相反的流程“否定”它:

fly_66b <- fly_66 %>%
  group_by(TO_muni, FROM_muni, YEAR) %>%
  summarise(Number = -sum(Number)) %>% #negative sum here
  rename(FROM_muni = TO_muni, TO_muni = FROM_muni) #you invert the column names to simulate the opposite flow

现在可以绑定了,使用“完成”功能生成缺失的组合,可以简单的用0填充

fly_66_final <- fly_66a %>%
  bind_rows(fly_66b) %>%
  complete(TO_muni, FROM_muni, YEAR, fill = list(Number = 0))

然后你可以按照你想要的方式安排

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多