如何在Base R中对列表元素进行“分组”

3

代码

list(c(1,2), c('a', 'b'), c('a', 'b'), c(2,3)) -> li
## 
## [[1]]
## [1] 1 2
## 
## [[2]]
## [1] "a" "b"
## 
## [[3]]
## [1] "a" "b"
## 
## [[4]]
## [1] 2 3

问题:需要从table()函数中获取所需输出。

Factor     c(1,2) c('a', 'b') c(2,3)
Freq           1        2        1 

看起来很基础,但我找不到解决方案。

编辑 - 不幸的是,我的列表包含大约500,000个元素。很抱歉没有提到这一点。一个解决方案可能是将列表中的项目合并为单个元素:

## 
## [[1]]
## [1] "1 2"
## 
## [[2]]
## [1] "a b"
## 
## [[3]]
## [1] "a b"
## 
## [[4]]
## [1] "2 3"

然后将列表取消并应用表格。

问:如何将列表元素连接成单个项目?

答: sapply(li, paste, collapse = "-") |> table()

2个回答

5

uniquematch 都能处理列表,因此您可以将列表与其自身的unique成员进行match。在结果上调用table函数,然后使用unique函数再次设置结果的名称。所有这些都可以通过一行代码完成:

setNames(table(match(li, unique(li))), unique(li))
#>    c(1, 2) c("a", "b")     c(2, 3) 
#>          1           2           1 

或者,如果您更喜欢清晰而不是简洁,基本的R管道等价物将是:

li |>
  match(unique(li))    |>
  table()              |>
  setNames(unique(li))
#>    c(1, 2) c("a", "b")     c(2, 3) 
#>          1           2           1 

1
你可以提取唯一的元素,然后计算列表中一个元素在唯一元素列表中出现的次数:
# All unique list elements
uniques = li[!duplicated(li)]

# How many list elements are inside the list containing a single unique element, for each unique element
freq = lapply(uniques, function(x) length(which(li %in% list(x))))

# Set the unique elements as names
names(freq) = uniques

freq
# $`c(1, 2)`
# [1] 1
# 
# $`c("a", "b")`
# [1] 2
# 
# $`c(2, 3)`
# [1] 1

啊,这是@Allan Cameron在他的回答中发布的相同方法...但他的解决方案更好 :) - DrEspresso

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接