根据条件在R中的另一个数据集中的一个数据集中添加列值 - 不同长度

时间:2017-07-06 14:00:25

标签: r

我有两个数据集。一个具有重复的位置名称,另一个具有位置名称并且其纬度为long。我想将lat long添加到第一个数据集,其中位置名称在第二个数据集中匹配。

DF1

 Code   Station Name
 BNC    BANGALORE CANT 
 BNC    BANGALORE CANT 
 BNC    BANGALORE CANT    
 BBS    BHUBANESWAR    
 BBS    BHUBANESWAR    

df2

Station Name     lat       lon
BANGALORE CANT  12.993690  77.59814
BHUBANESWAR     20.296059  85.82454

预期结果 DF1

 Code   Station Name        lat        lon
 BNC    BANGALORE CANT     12.993690  77.59814
 BNC    BANGALORE CANT     12.993690  77.59814
 BNC    BANGALORE CANT     12.993690  77.59814  
 BBS    BHUBANESWAR        20.296059  85.82454
 BBS    BHUBANESWAR        20.296059  85.82454

很明显,物体长度不同。我需要df1重复条目。 cbind不会因长度不同而起作用。同样适用于 ifelse sapply 。由于列表很长(超出查询最大值),因此使用地理编码获取df1的lat很长时间失败。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

它看起来像一个SQL问题。因此在R中,库dplyr是最佳选择。 这是一个工作示例,列的名称必须等于连接

library(dplyr)
iris
iris2<-data.frame("Species"=unique(iris$Species),"n"=c(1,2,3))
iris %>% inner_join(iris2)

PS你可以分享你的db use dput(dataframename)命令,帮助相关的例子真的更容易

答案 1 :(得分:0)

您可以使用dplyr::left_join来解决此类问题。 dplyr有一个有用的vignette来覆盖连接,或者你可以查看这个常规backgrounder on different kinds of joins

# Load dplyr and other useful packages
library(tidyverse)

# Generate demo dataset
df1 <-
  tibble(
    Code = c("BNC", "BNC", "BNC", "BBS", "BBS"),
    "Station Name" = c(
      "BANGALORE CANT",
      "BANGALORE CANT",
      "BANGALORE CANT",
      "BHUBANESWAR",
      "BHUBANESWAR"
    )
  )

df2 <- tibble("Station Name" = c("BANGALORE CANT", "BHUBANESWAR"),
              lat = c(12.993690, 20.296059),
              lon = c(77.59814, 85.82454))

# Join df1 and df2
left_join(df1, df2)

这假设两个数据集共享一个名称完全相同的列。如果要对两个数据集如何相互组合进行更多控制,可以使用by=参数。