知道我用于匹配两个数据集的变量不是唯一的,如何在 R 中合并不同的数据集?
How can I merge different data sets in R knowing that the variable that I use for matching the two data set are not unique?
我有两个数据集,我需要通过ID值合并它们。问题是:
- ID 值可以在同一数据集中重复(没有其他唯一值可用)。
- 两个数据集的行数或列数不相等。
示例:
df1
ID
Gender
99
Male
85
Female
7
Male
df2
ID
Body_Temperature
Body_Temperature_date_time
99
36
1/1/2020 12:00 am
99
38
2/1/2020 10:30 am
99
37
1/1/2020 06:41 am
52
38
1/2/2020 11:00 am
11
39
4/5/2020 09:09 pm
7
35
9/8/2020 02:30 am
我如何才能将这两个数据集转换成一个数据集,以便我以后可以在其上应用一些机器学习模型?
根据您的预期结果,如果您想要 return 来自每个数据框的所有行,那么您可以使用来自 dplyr
:
的 full_join
library(dplyr)
full_join(df2, df1, by = "ID")
或以 R 为基数:
merge(x=df2,y=df1,by="ID",all=TRUE)
输出
ID Body_Temperature Body_Temperature_date_time Gender
1 99 36 1/1/2020 12:00 am Male
2 99 38 2/1/2020 10:30 am Male
3 99 37 1/1/2020 06:41 am Male
4 52 38 1/2/2020 11:00 am <NA>
5 11 39 4/5/2020 09:09 pm <NA>
6 7 35 9/8/2020 02:30 am Male
7 85 NA <NA> Female
如果你有超过 2 个数据帧要合并,它们只与 ID
列重叠,那么你可以在数据帧列表上使用 reduce
(所以把你想要的所有数据帧组合成一个列表):
library(tidyverse)
df_list <- list(df1, df2)
multi_full <- reduce(df_list, function(x, y, ...)
full_join(x, y, by = "ID", ...))
或 Reduce
以 R 为基数:
df_list <- list(df1, df2)
multi_full <- Reduce(function(x, y, ...)
merge(x, y, by = "ID", all = TRUE, ...), df_list)
数据
df1 <- structure(list(ID = c(99L, 85L, 7L), Gender = c("Male", "Female",
"Male")), class = "data.frame", row.names = c(NA, -3L))
df2 <- structure(list(ID = c(99L, 99L, 99L, 52L, 11L, 7L), Body_Temperature = c(36L,
38L, 37L, 38L, 39L, 35L), Body_Temperature_date_time = c("1/1/2020 12:00 am",
"2/1/2020 10:30 am", "1/1/2020 06:41 am", "1/2/2020 11:00 am",
"4/5/2020 09:09 pm", "9/8/2020 02:30 am")), class = "data.frame", row.names = c(NA,
-6L))
我有两个数据集,我需要通过ID值合并它们。问题是:
- ID 值可以在同一数据集中重复(没有其他唯一值可用)。
- 两个数据集的行数或列数不相等。
示例:
df1
ID | Gender |
---|---|
99 | Male |
85 | Female |
7 | Male |
df2
ID | Body_Temperature | Body_Temperature_date_time |
---|---|---|
99 | 36 | 1/1/2020 12:00 am |
99 | 38 | 2/1/2020 10:30 am |
99 | 37 | 1/1/2020 06:41 am |
52 | 38 | 1/2/2020 11:00 am |
11 | 39 | 4/5/2020 09:09 pm |
7 | 35 | 9/8/2020 02:30 am |
我如何才能将这两个数据集转换成一个数据集,以便我以后可以在其上应用一些机器学习模型?
根据您的预期结果,如果您想要 return 来自每个数据框的所有行,那么您可以使用来自 dplyr
:
full_join
library(dplyr)
full_join(df2, df1, by = "ID")
或以 R 为基数:
merge(x=df2,y=df1,by="ID",all=TRUE)
输出
ID Body_Temperature Body_Temperature_date_time Gender
1 99 36 1/1/2020 12:00 am Male
2 99 38 2/1/2020 10:30 am Male
3 99 37 1/1/2020 06:41 am Male
4 52 38 1/2/2020 11:00 am <NA>
5 11 39 4/5/2020 09:09 pm <NA>
6 7 35 9/8/2020 02:30 am Male
7 85 NA <NA> Female
如果你有超过 2 个数据帧要合并,它们只与 ID
列重叠,那么你可以在数据帧列表上使用 reduce
(所以把你想要的所有数据帧组合成一个列表):
library(tidyverse)
df_list <- list(df1, df2)
multi_full <- reduce(df_list, function(x, y, ...)
full_join(x, y, by = "ID", ...))
或 Reduce
以 R 为基数:
df_list <- list(df1, df2)
multi_full <- Reduce(function(x, y, ...)
merge(x, y, by = "ID", all = TRUE, ...), df_list)
数据
df1 <- structure(list(ID = c(99L, 85L, 7L), Gender = c("Male", "Female",
"Male")), class = "data.frame", row.names = c(NA, -3L))
df2 <- structure(list(ID = c(99L, 99L, 99L, 52L, 11L, 7L), Body_Temperature = c(36L,
38L, 37L, 38L, 39L, 35L), Body_Temperature_date_time = c("1/1/2020 12:00 am",
"2/1/2020 10:30 am", "1/1/2020 06:41 am", "1/2/2020 11:00 am",
"4/5/2020 09:09 pm", "9/8/2020 02:30 am")), class = "data.frame", row.names = c(NA,
-6L))