合并两个不同维度的数据帧,没有 NAs
Merge two dataframes of different dimension, without having NAs
我正在尝试在 R 上合并两个不同的数据帧。一个数据帧包含大约 5000 个观测值 (dataframeA),而另一个数据帧包含 500 个 (dataframeB)。数据是关于邮政编码的。使用包 zipcodeR
我从 dataframeA 创建了 dataframeB。事实上,在 dataframeA 的所有 5000 个观测值中,只有 500 个不同的邮政编码。现在我想从 dataframeB 中提取城市,并使用相应的邮政编码将其添加到 dataframeA 的每一行。我该怎么做?
这是我正在做的一个小例子:
# DataframeA
ID ZIP
1 91107
2 90089
3 91107
4 91107
5 94720
# DataframeB
zipcode city
90089 Los Angeles
91107 Pasadena
94720 Berkeley
# FINAL DATASET I WANT
ID ZIP city
1 91107 Pasadena
2 90089 Los Angeles
3 91107 Pasadena
4 91107 Pasadena
5 94720 Berkeley
你知道怎么做吗?
我读了一些关于 if-else 的内容,但没有什么好的结果。
另一种选择是:
dataframeA$city <- dataframeA$city[match(dataframeA$ZIP, dataframeB$city)]
,但它不起作用。
您可以使用几种解决方案。我推荐使用 dplyr
的第二种解决方案,但是第一种解决方案也可以正常工作。
df1 <- data.frame(
ID = 1:5,
ZIP = c(91107,
90089,
91107,
91107,
94720)
)
df2 <- data.frame(
zipcode = c(90089,
91107,
94720),
city = c("Los Angeles",
"Pasadena",
"Berkeley")
)
# Base R
merge(df1, df2, by.x = "ZIP", by.y = "zipcode")
#> ZIP ID city
#> 1 90089 2 Los Angeles
#> 2 91107 1 Pasadena
#> 3 91107 3 Pasadena
#> 4 91107 4 Pasadena
#> 5 94720 5 Berkeley
# dplyr/tidyverse
library(dplyr)
df1 %>%
left_join(df2, by = c("ZIP" = "zipcode"))
#> ID ZIP city
#> 1 1 91107 Pasadena
#> 2 2 90089 Los Angeles
#> 3 3 91107 Pasadena
#> 4 4 91107 Pasadena
#> 5 5 94720 Berkeley
我正在尝试在 R 上合并两个不同的数据帧。一个数据帧包含大约 5000 个观测值 (dataframeA),而另一个数据帧包含 500 个 (dataframeB)。数据是关于邮政编码的。使用包 zipcodeR
我从 dataframeA 创建了 dataframeB。事实上,在 dataframeA 的所有 5000 个观测值中,只有 500 个不同的邮政编码。现在我想从 dataframeB 中提取城市,并使用相应的邮政编码将其添加到 dataframeA 的每一行。我该怎么做?
这是我正在做的一个小例子:
# DataframeA
ID ZIP
1 91107
2 90089
3 91107
4 91107
5 94720
# DataframeB
zipcode city
90089 Los Angeles
91107 Pasadena
94720 Berkeley
# FINAL DATASET I WANT
ID ZIP city
1 91107 Pasadena
2 90089 Los Angeles
3 91107 Pasadena
4 91107 Pasadena
5 94720 Berkeley
你知道怎么做吗?
我读了一些关于 if-else 的内容,但没有什么好的结果。
另一种选择是:
dataframeA$city <- dataframeA$city[match(dataframeA$ZIP, dataframeB$city)]
,但它不起作用。
您可以使用几种解决方案。我推荐使用 dplyr
的第二种解决方案,但是第一种解决方案也可以正常工作。
df1 <- data.frame(
ID = 1:5,
ZIP = c(91107,
90089,
91107,
91107,
94720)
)
df2 <- data.frame(
zipcode = c(90089,
91107,
94720),
city = c("Los Angeles",
"Pasadena",
"Berkeley")
)
# Base R
merge(df1, df2, by.x = "ZIP", by.y = "zipcode")
#> ZIP ID city
#> 1 90089 2 Los Angeles
#> 2 91107 1 Pasadena
#> 3 91107 3 Pasadena
#> 4 91107 4 Pasadena
#> 5 94720 5 Berkeley
# dplyr/tidyverse
library(dplyr)
df1 %>%
left_join(df2, by = c("ZIP" = "zipcode"))
#> ID ZIP city
#> 1 1 91107 Pasadena
#> 2 2 90089 Los Angeles
#> 3 3 91107 Pasadena
#> 4 4 91107 Pasadena
#> 5 5 94720 Berkeley