逐行计算列表列中的实例

时间:2018-09-20 02:44:47

标签: r dplyr purrr

我正在处理一个包含整数列表列的数据框。列表列中的每个元素对应于数据框中的一行,现在我想算一下有多少个链接。

arr包含一列dput,该列指示此数据样本的正确计数:

link_count

我找到了一个使用left_join的解决方案,但是我认为可能有一个更优雅的解决方案,可以使用move link_count links 1 1 NA 2 0 1 3 1 NA 4 1 3 5 4 4 6 1 5 7 0 5, 6 8 2 5 9 0 8 10 0 5, 8 #dput results saved as `x` x <- structure(list(move = 1:10, link_count = c(1, 0, 1, 1, 4, 1, 0, 2, 0, 0), links = list(NA_integer_, 1L, NA_integer_, 3L, 4L, 5L, 5:6, 5L, 8L, c(5L, 8L))), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame"), .Names = c("move", "link count", "links")) dplyr::mutate工作流来逐行执行。我希望可以通过一系列管道来完成某些工作。

purrr::map

3 个答案:

答案 0 :(得分:2)

可以选择base R。在这里,缺少的元素是NA而不是0

as.numeric(table(unlist(x$links))[as.character(x$move)])

答案 1 :(得分:2)

base R的另一个选项完全基于@akrun答案:

x$n <- as.numeric(table(factor(unlist(x$links), levels = x$move)))

答案 2 :(得分:1)

为了换个节奏,我将提供一个详尽的答案。您可以使用right_join来保持管道滚动:

x %>%
  unnest(links) %>%
  group_by(links) %>%
  summarise(link_count=n()) %>%
  right_join(x, by=c("links"="move"))

## A tibble: 10 x 4
#   links link_count `link count`   links.y
#   <int>      <int>        <dbl>    <list>
# 1     1          1            1 <int [1]>
# 2     2         NA            0 <int [1]>
# 3     3          1            1 <int [1]>
# 4     4          1            1 <int [1]>
# 5     5          4            4 <int [1]>
# 6     6          1            1 <int [1]>
# 7     7         NA            0 <int [2]>
# 8     8          2            2 <int [1]>
# 9     9         NA            0 <int [1]>
#10    10         NA            0 <int [2]>