问题描述
我如何将两者结合在一起,以使最终输出是一个单独的行,其中包含id
中的val
和x
列,而每个{{ 1}}按出现顺序的值num
,num_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