嵌套列表上的left_join

问题描述

我有一个嵌套的df x一个没有嵌套的df y

我如何将两者结合在一起,以使最终输出一个单独的行,其中包含id中的valx列,而每个{{ 1}}按出现顺序的值numnum_1 ...?

num_2

UseMethod(“ left_join”)中的错误:没有适用于“ left_join”的适用方法应用于类“ list”的对象

reprex package(v0.3.0)于2020-08-14创建

编辑:我正在寻找松散的东西,同时仍保持ID列。

library(tidyverse)

x <- tibble(id = list(letters[1:6]),val = 13)
x

#> # A tibble: 1 x 2
#>   id          val
#>   <list>    <dbl>
#> 1 <chr [6]>    13

y <- tibble(id = letters[1:6],num = rnorm(6))
y

#> # A tibble: 6 x 2
#>   id       num
#>   <chr>  <dbl>
#> 1 a      0.532
#> 2 b     -0.106
#> 3 c     -0.105
#> 4 d      0.973
#> 5 e     -0.825
#> 6 f     -0.951

map2(x,y,left_join,by = 'id')

解决方法

继续您的工作,您可以尝试以下操作。

library(dplyr)
library(tidyr)

x %>% 
  unnest(id) %>% 
  left_join(y,by = "id") %>% 
  mutate(name = row_number(),id = list(id)) %>% 
  pivot_wider(values_from = num,names_glue = "num_{name}")

# # A tibble: 1 x 8
#   id          val num_1  num_2  num_3   num_4 num_5 num_6
#   <list>    <dbl> <dbl>  <dbl>  <dbl>   <dbl> <dbl> <dbl>
# 1 <chr [6]>    13  1.28 -0.387 -0.438 -0.0826 0.164 -1.24

x %>%
  mutate(num = map(id,~ tibble::deframe(y) %>% .[match(names(.),.x)] %>% unname)) %>%
  unnest_wider(num,names_sep = "_")

# # A tibble: 1 x 8
#   id          val num_1  num_2  num_3   num_4 num_5 num_6
#   <list>    <dbl> <dbl>  <dbl>  <dbl>   <dbl> <dbl> <dbl>
# 1 <chr [6]>    13  1.28 -0.387 -0.438 -0.0826 0.164 -1.24

第二个解决方案的说明

deframe()中的

tibble将两列data.frame转换为命名向量,第一列转换为向量名称,第二列转换为向量值。 deframe(y) %>% .[match(names(.),.x)]等效于deframe(y)[match(names(deframe(y)),.x)]deframe(y)部分出现了两次,因此我将其移到管道的前面,并使用.符号将其表示在管道的后面。该行用于匹配数据的id列的位置和num的{​​{1}}列的重新排序。

,

根据您的y,您不会有多列,而是会稍微调整示例,这是您的目标吗?

x <- tibble(id = list(letters[1:6]),val = 13)
y <- tibble(id = rep(letters[1:6],2),num = rnorm(12),name = paste0("num_",rep(1:2,each = 6)))

map_dfr(x$id[[1]],~tibble(id = .x,val = x$val)) %>% 
  left_join(
    pivot_wider(y,names_from = name,values_from = num)
  )

#> Joining,by = "id"
#> # A tibble: 6 x 4
#>   id      val   num_1  num_2
#>   <chr> <dbl>   <dbl>  <dbl>
#> 1 a        13  0.609   1.97 
#> 2 b        13  0.956  -1.84 
#> 3 c        13  0.425   0.297
#> 4 d        13  0.0379 -0.784
#> 5 e        13 -0.532  -0.769
#> 6 f        13  0.538  -1.10

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...