【问题标题】:Manipulation of Columns in Data Table (replace, sort)操作数据表中的列(替换、排序)
【发布时间】:2021-10-25 08:15:42
【问题描述】:

我想操作两个数据表的列来创建一个桑基图。 我有一个2018 年的数据表和一个2019 的数据表(两者都具有相同的列名/顺序):

dt.2018 <- structure(list(Year = c(2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L), 
                          id = c(100236L, 101554L, 111328L, 124213L, 127434L, 128509L, 130058L, 130192L, 130224L, 130309L),
                          EV = c(-33498.61, 0, -31117.17, 70950.43, -37984.99, 0, 0, -93820830.01, -7852622.13, -245712.8), 
                          group = structure(c(1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L), .Label = c("0", "1", "2", "3"), class = "factor")), 
                         class = c("data.table", "data.frame"), row.names = c(NA, -10L))

dt.2019 <- structure(list(Year = c(2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L), 
                          id = c(100236L, 101554L, 111328L, 124213L, 127434L, 128003L, 128509L, 130058L, 130192L, 130351L), 
                          EV = c(-130944.64, 21951918.61, 15335.68, 101518.72, 36552.26, 0, 78507.63, 0, 0, 276820967.02), 
                          group = structure(c(1L, 4L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("0", "1", "2", "3"), class = "factor")), 
                         class = c("data.table", "data.frame"), row.names = c(NA, -10L))

首先我想比较id 列。

  1. dt.2019中的ids,不在dt.2018中的可以删除(整行)。
  2. 对于dt.2018中的ids,它们不在dt.2019中,我们必须将整行复制/绑定到dt.2019,然后将group的数量替换为dt.2019中的8 .
  3. 最后我想对两者的id 列进行排序(相同的id 必须位于相同的行索引)。
  4. dt.2019 中替换group 整数:将c(0,1,2,3) 替换为c(4,5,6,7)8 应该保持不变。

我怎样才能快速有效地做到这一点?

【问题讨论】:

  • 对于未来的读者:here 您可以找到相关/以前的问题。

标签: r replace data.table data-manipulation


【解决方案1】:

条件对我来说非常复杂, 如果此代码与您的目的不符,请告诉我。

    dt.2019 %>%
      filter(id %in% dt.2018$id) %>%
      mutate(group = recode_factor(group, "0" = "4", "1" = "5", "2" ="6", "3" ="7")) %>%
      rbind(dt.2018 %>%
              filter(! id %in% dt.2019$id) %>%
              mutate(group = 8)) %>%
      arrange(id)

【讨论】:

  • 这正是我的做法。只有一个区别,而不是rbind 我使用的是bind_rows
【解决方案2】:

我们可以通过 semi_joinanti_joinbind_rowsreocde_factor 的组合来做到这一点,所有这些都在 dplyr

library(dplyr)

dt.2019 %>% 
  semi_join(dt.2018, by="id") %>% 
  mutate(group = recode_factor(group, "0" = "4", "1" = "5", "2" ="6", "3" ="7")) %>% 
  bind_rows(dt.2018 %>% 
              anti_join(dt.2019, by="id") %>% 
              mutate(group=8, group=as.factor(group))
            )

输出:

    Year     id          EV group
 1: 2019 100236  -130944.64     4
 2: 2019 101554 21951918.61     7
 3: 2019 111328    15335.68     4
 4: 2019 124213   101518.72     5
 5: 2019 127434    36552.26     5
 6: 2019 128509    78507.63     5
 7: 2019 130058        0.00     5
 8: 2019 130192        0.00     5
 9: 2018 130224 -7852622.13     8
10: 2018 130309  -245712.80     8

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    相关资源
    最近更新 更多