Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以在dplyr中进行完全联接并保留联接中使用的所有列?_R_Dplyr_Sparklyr - Fatal编程技术网

是否可以在dplyr中进行完全联接并保留联接中使用的所有列?

是否可以在dplyr中进行完全联接并保留联接中使用的所有列?,r,dplyr,sparklyr,R,Dplyr,Sparklyr,我有两个表,我想使用dplyr进行完全连接,但我不想让它删除任何列。根据文档和我自己的经验,它只保留左侧的join列。当您有一行的右侧有记录时,这是一个问题,因为联接值已消失 例如,假设我有两个表a和b customerId | revenue customerId | state -----------|--------- -----------|------- 1 | 2000

我有两个表,我想使用dplyr进行完全连接,但我不想让它删除任何列。根据文档和我自己的经验,它只保留左侧的join列。当您有一行的右侧有记录时,这是一个问题,因为联接值已消失

例如,假设我有两个表a和b

customerId | revenue               customerId | state
-----------|---------              -----------|-------
    1      | 2000                       1     |  CA
    2      | 3000                       3     |  GA
    4      | 4000                       4     |  NY
像full_joina,b,by=customerId这样的操作将产生

customerId | revenue | state
-----------|---------|-------
    1      |   2000  |  CA
    2      |   3000  | <NA>
   <NA>    |   <NA>  |  GA
    4      |   4000  |  NY
因此,无法判断第三排是哪个客户。理想的输出是

customerId.a | customerId.b | revenue | state
-------------|--------------|---------|-------
      1      |      1       |   2000  |  CA
      2      |     <NA>     |   3000  | <NA>
    <NA>     |      3       |   <NA>  |  GA
      4      |      4       |   4000  |  NY
请注意,这只是一个玩具示例。我实际上在使用SparkyR,所以这一切都在Spark中运行。因此,合并在这里对我不起作用。有没有一种方法可以实现我在dplyr中寻找的目标

编辑: 正如有人指出的那样,这实际上是在dplyr本身的本地工作。然而,我确实看到了使用sparklyr的问题,它使用dplyr。下面是代码以查看:

library(sparklyr)
sc <- spark_connect("local[4]")
d1 <- data_frame(customerId = c("1","2","4"), revenue=c(2000,3000,4000))
d2 <- data_frame(customerId = c("1","3","4"), state=c("CA", "GA", "NY"))
d1_tbl <- copy_to(sc, d1)
d2_tbl <- copy_to(sc, d2)
full_join(d1_tbl, d2_tbl, by=c("customerId"))

我无法重现你的问题。所有ID都应包含在完全联接中

library(data_frame)
d1 <- data_frame(
  customerId = c(1, 2, 4),
  revenue = c(2000, 3000, 4000)
)
d2 <- data_frame(
  customerId = c(1, 3, 4),
  state = c("CA", "GA", "NY")
)

full_join(d1, d2, by = "customerId")
## # A tibble: 4 × 3
##   customerId revenue state
##        <dbl>   <dbl> <chr>
## 1          1    2000    CA
## 2          2    3000  <NA>
## 3          4    4000    NY
## 4          3      NA    GA
您可以尝试运行自定义SQL查询以获得所需的内容,尽管这有点混乱

library(DBI)
qry <- "SELECT 
    d1.customerID AS customerID1, 
    d2.customerID AS customerID2, 
    d1.revenue, 
    d2.state 
  FROM d1 
  FULL JOIN d2 
    ON d1.customerId = d2.customerId"
dbGetQuery(sc, qry)  
##   customerID1 customerID2 revenue state
## 1           1           1    2000    CA
## 2           2        <NA>    3000  <NA>
## 3        <NA>           3     NaN    GA
## 4           4           4    4000    NY

在联接之前,可以为两个数据帧创建单独的相同customerId:

这个问题已经解决了

> full_join(d1_tbl, d2_tbl, by="customerId")
# Source:   lazy query [?? x 3]
# Database: spark_connection
  customerId revenue state
       <chr>   <dbl> <chr>
1          1    2000    CA
2          3     NaN    GA
3          2    3000  <NA>
4          4    4000    NY

谢谢你指出这一点。我应该先自己试试。非常有趣。这绝对不是我在使用Sparkyr时看到的行为。我将创建一个代码示例来演示和更新我的问题。我喜欢这个想法,可能会尝试一下作为解决方法。然而,正如Richie指出的那样,这确实在dplyr本身内部起作用。虽然使用SparkyR,但行为是不同的。这应该是公认的答案-问题是关于保留两个表中的所有列,如果要检查哪些行没有联接,则需要保留这些列,而不仅仅是一个包含联接键所有值的列。这个答案是目前为止最简单的解决方法。在这里提出了一个问题:。谢谢
full_join(
    mutate(a, customerId.a = customerId), 
    mutate(b, customerId.b = customerId), 
    by="customerId"
) %>% select(-customerId)

#  revenue customerId.a state customerId.b
#1    2000            1    CA            1
#2    3000            2  <NA>           NA
#3    4000            4    NY            4
#4      NA           NA    GA            3
> full_join(d1_tbl, d2_tbl, by="customerId")
# Source:   lazy query [?? x 3]
# Database: spark_connection
  customerId revenue state
       <chr>   <dbl> <chr>
1          1    2000    CA
2          3     NaN    GA
3          2    3000  <NA>
4          4    4000    NY