英文:
Conditional Left Joining in dplyr
问题
dat1 需要与 dat2 进行左连接,连接条件是 ID,并且选择 dat2 中具有最小 Veh 和 Pert 值的行。最终的数据将如下所示:
ID Per Gu Ta Veh Pert Ti ID1
1 1123 112301 14 13 1 1 100 11231
2 1124 112401 14 19 1 1 107 11241
3 1125 112501 29 25 2 2 118 11251
4 1126 112601 22 20 3 1 112 11268
在 dat2 的第8行中,Per 的最小值为 1,但 Veh 为 4,所以选择了 Veh 为最小值。
英文:
I have two datasets.
Dataset 1 looks like the following:
dat1 <- read.table(header=TRUE, text="
ID Per Gu Ta
1123 112301 14 13
1124 112401 14 19
1125 112501 29 25
1126 112601 22 20
")
dat1
ID Per Gu Ta
1 1123 112301 14 13
2 1124 112401 14 19
3 1125 112501 29 25
4 1126 112601 22 20
Dataset 2 looks like the following:
dat2 <- read.table(header=TRUE, text="
ID Veh Pert Ti ID1
1123 1 1 100 11231
1123 2 1 110 11232
1124 1 1 107 11241
1124 2 1 111 11242
1124 3 2 109 11243
1125 2 2 118 11251
1125 3 3 113 11252
1125 4 1 108 11253
1126 3 4 119 11265
1126 3 1 112 11268
")
dat2
ID Veh Pert Ti ID1
1 1123 1 1 100 11231
2 1123 2 1 110 11232
3 1124 1 1 107 11241
4 1124 2 1 111 11242
5 1124 3 2 109 11243
6 1125 2 2 118 11251
7 1125 3 2 113 11252
8 1125 4 1 108 11253
9 1126 3 4 119 11265
10 1126 3 1 112 11268
dat1 is needed to be left joined with dat2 by ID with rows having the minimum of at first Veh and then Pert of dat2. The final data will be like the following:
ID Per Gu Ta Veh Pert Ti ID1
1123 112301 14 13 1 1 100 11231
1124 112401 14 19 1 1 107 11241
1125 112501 29 25 2 2 118 11251 ### in `row 8` of `dat2` the min value of `Per` is `1` but `Veh` is `4`;
1126 112601 22 20 3 1 112 11268
答案1
得分: 1
我是你的中文翻译,以下是已翻译好的代码部分:
# 我是你的中文翻译,以下是已翻译好的代码部分:
# 步骤1:使用left_join然后根据Veh和Pert进行arrange排序
# 步骤2:按ID分组并选择第一个值
# 加载dplyr库
library(dplyr)
# 创建dat1数据框
dat1 <- read.table(
header = TRUE,
text = "
ID Per Gu Ta
1123 112301 14 13
1124 112401 14 19
1125 112501 29 25
1126 112601 22 20
"
)
# 创建dat2数据框
dat2 <- read.table(
header = TRUE,
text = "
ID Veh Pert Ti ID1
1123 1 1 100 11231
1123 2 1 110 11232
1124 1 1 107 11241
1124 2 1 111 11242
1124 3 2 109 11243
1125 2 2 118 11251
1125 3 3 113 11252
1125 4 1 108 11253
1126 3 4 119 11265
1126 3 1 112 11268
"
)
# 左连接或按Veh然后Pert排序
left_joined_df <-
dat1 %>% left_join(dat2, by = c("ID" = "ID")) %>% arrange(Veh, Pert)
# 按ID分组并选择第一个值
result_df <-
left_joined_df %>% group_by(ID) %>% summarize(
.groups = 'keep',
Per = first(Per),
Gu = first(Gu),
Ta = first(Ta),
Veh = first(Veh),
Pert = first(Pert),
Ti = first(Ti),
ID1 = first(ID1)
) %>% ungroup()
这是你提供的R代码的翻译版本,仅包括代码部分,没有其他内容。
英文:
I've done it this way:
left_jointhenarrangebased on Veh and Pertgroup_byID and pickingfirstvalues
library(dplyr)
dat1 <- read.table(
header = TRUE,
text = "
ID Per Gu Ta
1123 112301 14 13
1124 112401 14 19
1125 112501 29 25
1126 112601 22 20
"
)
dat2 <- read.table(
header = TRUE,
text = "
ID Veh Pert Ti ID1
1123 1 1 100 11231
1123 2 1 110 11232
1124 1 1 107 11241
1124 2 1 111 11242
1124 3 2 109 11243
1125 2 2 118 11251
1125 3 3 113 11252
1125 4 1 108 11253
1126 3 4 119 11265
1126 3 1 112 11268
"
)
# left join or order by Veh then Pert
left_joined_df <-
dat1 %>% left_join(dat2, by = c("ID" = "ID")) %>% arrange(Veh, Pert)
# group by ID and picking first values
result_df <-
left_joined_df %>% group_by(ID) %>% summarize(
.groups = 'keep',
Per = first(Per),
Gu = first(Gu),
Ta = first(Ta),
Veh = first(Veh),
Pert = first(Pert),
Ti = first(Ti),
ID1 = first(ID1)
) %>% ungroup()
答案2
得分: 1
dat1 |>
left_join(dat2 |>
arrange(Veh, Pert) |>
slice(1, .by = ID))
连接中 by = join_by(ID) 的部分:
ID Per Gu Ta Veh Pert Ti ID1
1 1123 112301 14 13 1 1 100 11231
2 1124 112401 14 19 1 1 107 11241
3 1125 112501 29 25 2 2 118 11251
4 1126 112601 22 20 3 1 112 11268
英文:
dat1 |>
left_join(dat2 |>
arrange(Veh, Pert) |>
slice(1, .by = ID))
Joining with `by = join_by(ID)`
ID Per Gu Ta Veh Pert Ti ID1
1 1123 112301 14 13 1 1 100 11231
2 1124 112401 14 19 1 1 107 11241
3 1125 112501 29 25 2 2 118 11251
4 1126 112601 22 20 3 1 112 11268
答案3
得分: 1
以下是翻译好的部分:
容易完成。
library(tidyverse)
dat_join <- left_join(dat1, dat2, by = "ID") %>%
arrange(Veh) %>%
arrange(Pert)
dat_join
英文:
Easily done.
library(tidyverse)
dat_join <- left_join(dat1, dat2, by = "ID") %>%
arrange(Veh) %>%
arrange(Pert)
dat_join
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论