基于R中的多列合并两个数据框
Merge two data frames based on multiple columns in R
我有两个类似的数据框
数据框 1:
P.X value
OOPA 5
POKA 4
JKIO 3
KOPP 1
数据框 2:
P.X.1 P.X.2 P.X.3 P.X.4 mass
JKIO UIX HOP 56
CX OOPA 44
EDD POKA 13
KOPP FOSI 11
我想合并基于 df1 P.X 和 df2 P.X.1,P.X.2,P.X.3,[ 的两个数据文件=28=].4.所以如果它是 P.X.2 中的 JKIO。出现在 P.X 中,然后将它们合并到同一行 JKIO、3、56 中的新数据框中,如下所示:
新数据框:
P.X value mass
OOPA 5 44
POKA 4 13
JKIO 3 56
KOPP 1 11
你知道我该怎么做吗
merge(df1,df2 by(P.X == P.X.1 | P.X.2 | P.X.3 | P.X.4)
?
你也可以这样做:
df_new <- cbind(df1, df2[,5])
以下是实现您的目标的一种方法。您想要将 df2
转换为长格式数据并获取超过 1 个字符的行。获得此数据后,将 df1 与更新后的 df2 合并。
library(dplyr)
library(tidyr)
left_join(df1,
pivot_longer(df2, cols = P.X.1:P.X.4, names_to = "foo",
values_to = "P.X") %>% filter(nchar(P.X) > 0),
by = "P.X") %>%
select(-foo)
P.X value mass
1 OOPA 5 44
2 POKA 4 13
3 JKIO 3 56
4 KOPP 1 11
数据
df1 <- structure(list(P.X = c("OOPA", "POKA", "JKIO", "KOPP"), value = c(5L,
4L, 3L, 1L)), class = "data.frame", row.names = c(NA, -4L))
df2 <- structure(list(P.X.1 = c("", "", "EDD", "KOPP"), P.X.2 = c("JKIO",
"", "", "FOSI"), P.X.3 = c("UIX", "CX", "POKA", ""), P.X.4 = c("HOP",
"OOPA", "", ""), mass = c(56, 44, 13, 11)), row.names = c(NA,
-4L), class = c("tbl_df", "tbl", "data.frame"))
我有两个类似的数据框
数据框 1:
P.X value
OOPA 5
POKA 4
JKIO 3
KOPP 1
数据框 2:
P.X.1 P.X.2 P.X.3 P.X.4 mass
JKIO UIX HOP 56
CX OOPA 44
EDD POKA 13
KOPP FOSI 11
我想合并基于 df1 P.X 和 df2 P.X.1,P.X.2,P.X.3,[ 的两个数据文件=28=].4.所以如果它是 P.X.2 中的 JKIO。出现在 P.X 中,然后将它们合并到同一行 JKIO、3、56 中的新数据框中,如下所示:
新数据框:
P.X value mass
OOPA 5 44
POKA 4 13
JKIO 3 56
KOPP 1 11
你知道我该怎么做吗
merge(df1,df2 by(P.X == P.X.1 | P.X.2 | P.X.3 | P.X.4)
?
你也可以这样做:
df_new <- cbind(df1, df2[,5])
以下是实现您的目标的一种方法。您想要将 df2
转换为长格式数据并获取超过 1 个字符的行。获得此数据后,将 df1 与更新后的 df2 合并。
library(dplyr)
library(tidyr)
left_join(df1,
pivot_longer(df2, cols = P.X.1:P.X.4, names_to = "foo",
values_to = "P.X") %>% filter(nchar(P.X) > 0),
by = "P.X") %>%
select(-foo)
P.X value mass
1 OOPA 5 44
2 POKA 4 13
3 JKIO 3 56
4 KOPP 1 11
数据
df1 <- structure(list(P.X = c("OOPA", "POKA", "JKIO", "KOPP"), value = c(5L,
4L, 3L, 1L)), class = "data.frame", row.names = c(NA, -4L))
df2 <- structure(list(P.X.1 = c("", "", "EDD", "KOPP"), P.X.2 = c("JKIO",
"", "", "FOSI"), P.X.3 = c("UIX", "CX", "POKA", ""), P.X.4 = c("HOP",
"OOPA", "", ""), mass = c(56, 44, 13, 11)), row.names = c(NA,
-4L), class = c("tbl_df", "tbl", "data.frame"))