我正在处理一个包含整数列表列的数据框。列表列中的每个元素对应于数据框中的一行,现在我想算一下有多少个链接。
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
答案 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]>