数据 Table 中的列操作(替换、排序)
Manipulation of Columns in Data Table (replace, sort)
我想操纵两个数据的列 table 来创建桑基图。
我有一个 table 的数据 2018
和一个 2019
的数据(两者都有相同的列 names/order):
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
列。
不在 dt.2018
中的 id
可以删除(整行)。dt.2019
。
- 对于
dt.2018
的 id
,它们不在 dt.2019
中,我们必须将整行 copy/rbind 变成 dt.2019
然后替换数字group
8
在 dt.2019
.
- 最后我想对两者的
id
列进行排序(相同的 id
必须在同一行索引处)。
- 替换
dt.2019
中的 group
个整数:用 c(4,5,6,7)
替换 c(0,1,2,3)
,8
应该保持不变。
我怎样才能快速有效地做到这一点?
条件对我来说非常复杂,
如果此代码与您的目的不符,请告诉我。
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)
我们可以将 semi_join
和 anti_join
以及 bind_rows
和 reocde_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
我想操纵两个数据的列 table 来创建桑基图。
我有一个 table 的数据 2018
和一个 2019
的数据(两者都有相同的列 names/order):
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
列。
-
不在
id
可以删除(整行)。dt.2019
。- 对于
dt.2018
的id
,它们不在dt.2019
中,我们必须将整行 copy/rbind 变成dt.2019
然后替换数字group
8
在dt.2019
. - 最后我想对两者的
id
列进行排序(相同的id
必须在同一行索引处)。 - 替换
dt.2019
中的group
个整数:用c(4,5,6,7)
替换c(0,1,2,3)
,8
应该保持不变。
dt.2018
中的 我怎样才能快速有效地做到这一点?
条件对我来说非常复杂, 如果此代码与您的目的不符,请告诉我。
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)
我们可以将 semi_join
和 anti_join
以及 bind_rows
和 reocde_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