根据第二个列表列,在R中的data.table中展开列表的嵌套元素

k97glaaz  于 2023-04-27  发布在  其他
关注(0)|答案(4)|浏览(112)

我有一个R语言的数据表

> data.table(value="one",list1=list(c(list("one1"),list("one2"),list(c("one3 1","one3 2")))),position=list(c(0,1,2)))
     value     list1  position
  1:   one <list[3]>     0,1,2

其中<list[3]>元素是

[[1]]
[[1]][[1]]
[1] "one1"

[[1]][[2]]
[1] "one2"

[[1]][[3]]
[1] "one3 1" "one3 2"

我想加长data.table,这样我就有了

value   list1     position
one     "one1"    0
one     "one2"    1
one     "one3 1"  2
one     "one3 2"  2

其中“one3 2”对应于位置2。到目前为止,我所有的尝试都导致位置3被列出为“one3 2”。是否有修复方法?

h43kikqp

h43kikqp1#

如果这是您的实际数据集,这里有一个选项,但不确定其他可能适用于您的数据的逻辑:

library(data.table)
library(tidyverse)

dt <- data.table(
  value="one",
  list1=list(c(list("one1"),list("one2"),list(c("one3 1","one3 2")))),
  position=list(c(0,1,2))
  )

dt %>% 
  tidyr::unnest_longer(c(list1, position)) %>% 
  tidyr::unnest_longer(list1) %>% 
  dplyr::mutate(temp_index = readr::parse_number(list1) - 1) %>% 
  dplyr::filter(position == temp_index) %>% 
  dplyr::select(-temp_index)

#> # A tibble: 4 × 3
#>   value list1  position
#>   <chr> <chr>     <dbl>
#> 1 one   one1          0
#> 2 one   one2          1
#> 3 one   one3 1        2
#> 4 one   one3 2        2
a9wyjsp7

a9wyjsp72#

使用data.table

library(data.table)
 dt1[, .(value, list1 = unlist(list1),
   position = c(mapply(\(x, y) rep(x, lengths(y)), position, list1)))]
  • 输出
value  list1 position
1:   one   one1        0
2:   one   one2        1
3:   one one3 1        2
4:   one one3 2        2
wlp8pajw

wlp8pajw3#

我猜你可以像下面这样使用unnest两次

dt %>%
  unnest(c(list1, position)) %>%
  unnest(list1)

它给出了

# A tibble: 4 × 3
  value list1  position
  <chr> <chr>     <dbl>
1 one   one1          0
2 one   one2          1
3 one   one3 1        2
4 one   one3 2        2
mtb9vblg

mtb9vblg4#

下面是另一种只依赖于data.table的时髦方法:

dt[, .(value, list1 = unlist(list1, recursive = FALSE), position = unlist(position))][, .(list1 = unlist(list1)), by = .(value, position)]
#>    value position  list1
#> 1:   one        0   one1
#> 2:   one        1   one2
#> 3:   one        2 one3 1
#> 4:   one        2 one3 2

或者更简单一点:

dt[, .(value, list1 = list1[[1]], position = position[[1]])][, .(list1 = unlist(list1)), by = .(value, position)]
#>    value position  list1
#> 1:   one        0   one1
#> 2:   one        1   one2
#> 3:   one        2 one3 1
#> 4:   one        2 one3 2

相关问题