我有一个关于dplyr变异连接的一般性问题

ecbunoof  于 2023-01-06  发布在  其他
关注(0)|答案(2)|浏览(130)

dplyr包的文档中指出,要使用“by”,需要“要通过其进行连接的变量的字符向量”。
然而,情况似乎并非如此。
它似乎可以与数字或dbl变量(即列)一起工作,我指的是用于连接 Dataframe 的公共列(标识符)。
这是两个 Dataframe 的一部分。nomem_encr是公共标识符。

df1
Rows: 2,525
Columns: 11
$ nomem_encr <dbl> 800054, 800170, 800186, 800204, 800228, 800274, 
$ mj16a093   <dbl+lbl>  4,  4,  3,  4,  2,  5,  5,  3,  5,  3,  6,  
$ mj16a094   <dbl+lbl>  3,  4,  2,  4,  2,  5,  5,  2,  3,  2,  6, 

df2
Rows: 6,092
Columns: 3
$ nomem_encr <dbl> 800009, 800015, 800042, 800054, 800057, 800085, 
$ cv16h101   <dbl+lbl>   2,   3,   5,   6,   7,   6,   0,   6,   5,   
$ cv16h044   <dbl+lbl>  6,  7,  7,  8,  0,  7,  5,  4,  7,  8,  7,  

df3 <- left_join(df1, df2, by = "nomem_encr")

最好是转换为字符,还是无所谓?我的假设是,值只需要是唯一标识符。

abithluo

abithluo1#

“by”:“要通过连接的变量的字符向量”"
这意味着当您编写连接时,您的by参数需要是一个字符向量,而NOT您的列需要是一个字符。

left_join(d1, d2, by = c('ID', 'Latitude'))

您将字符向量传递给by参数。列是否为数值并不重要

lsmd5eda

lsmd5eda2#

使用左连接

措辞可能会更好,但帮助页面的意思是你必须为变量名提供一个字符向量,但变量类型可以是任何类型。基本上你是在告诉by参数“join by this variable explicitly”。来自Hadley威克姆的R for Data Science的一个可视化可能有助于说明这是如何用left_join完成的,其中“key”是连接所需的by列:

一个简单的例子是nycflights13数据集,首先加载tidyverse和nycflights13包。

#### Load Library ####
library(tidyverse)
library(nycflights13)

然后可以检查flights数据集和planes数据集共享哪些列。

#### Check Joinable Columns ####
colnames(flights)
colnames(planes) # share tail number

我们发现它们都包含“tailnum”:

> colnames(flights)
 [1] "year"           "month"          "day"            "dep_time"      
 [5] "sched_dep_time" "dep_delay"      "arr_time"       "sched_arr_time"
 [9] "arr_delay"      "carrier"        "flight"         "tailnum"       
[13] "origin"         "dest"           "air_time"       "distance"      
[17] "hour"           "minute"         "time_hour"     
> colnames(planes) # share tail number
[1] "tailnum"      "year"         "type"         "manufacturer" "model"       
[6] "engines"      "seats"        "speed"        "engine"

我们可以通过left_join和tailnum变量将两个数据集与by结合起来,如下所示:

#### Join Two Dataframes ####
flight2 <- flights %>% 
  left_join(planes,
            by = "tailnum")
flight2

这样我们就得到了综合数据:

# A tibble: 336,776 × 27
   year.x month   day dep_time sched_de…¹ dep_d…² arr_t…³ sched…⁴ arr_d…⁵ carrier
    <int> <int> <int>    <int>      <int>   <dbl>   <int>   <int>   <dbl> <chr>  
 1   2013     1     1      517        515       2     830     819      11 UA     
 2   2013     1     1      533        529       4     850     830      20 UA     
 3   2013     1     1      542        540       2     923     850      33 AA     
 4   2013     1     1      544        545      -1    1004    1022     -18 B6     
 5   2013     1     1      554        600      -6     812     837     -25 DL     
 6   2013     1     1      554        558      -4     740     728      12 UA     
 7   2013     1     1      555        600      -5     913     854      19 B6     
 8   2013     1     1      557        600      -3     709     723     -14 EV     
 9   2013     1     1      557        600      -3     838     846      -8 B6     
10   2013     1     1      558        600      -2     753     745       8 AA     
# … with 336,766 more rows, 17 more variables: flight <int>, tailnum <chr>,
#   origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>, hour <dbl>,
#   minute <dbl>, time_hour <dttm>, year.y <int>, type <chr>,
#   manufacturer <chr>, model <chr>, engines <int>, seats <int>, speed <int>,
#   engine <chr>, and abbreviated variable names ¹​sched_dep_time, ²​dep_delay,
#   ³​arr_time, ⁴​sched_arr_time, ⁵​arr_delay
其他联接的概化性

顺便说一下,这是由dplyr中的所有其他连接完成的,但是它如何完成取决于您使用的连接。(使用的第一个 Dataframe ,在这种情况下为flights),而right_join通过y连接(第二个 Dataframe planes)。下面是另外三个例子,我已经根据它们的用法标记了它们:

#### Alternative Joins ####
flights %>% 
  right_join(planes,
             by = "tailnum") # includes all rows in y

flights %>% 
  inner_join(planes,
             by = "tailnum") # includes all rows in x AND y

flights %>% 
  full_join(planes,
            by = "tailnum") # includes all rows in x OR y

尝试一下它们,看看哪一个最适合您的用例。

相关问题