计算R中列表元素的数量和频率?

时间:2012-06-15 09:36:39

标签: r list element

我有一个包含不同数量元素的长列表,这些元素也可以在同一个字段中重复出现 这是前五行的一个例子:

A <- list(c("JAMES","CHARLES","JAMES","RICHARD"),  
          c("JOHN","ROBERT","CHARLES"),  
          c("CHARLES","WILLIAM","CHARLES","MICHAEL","WILLIAM","DAVID","CHARLES","WILLIAM"),  
          c("CHARLES"),  
          c("CHARLES","CHARLES"))  

现在我想计算列表每一行的元素数量 我想要的输出看起来与此相似:

[1] 4  
[2] 3  
[3] 7  
[4] 1  
[5] 2  

除此之外,我想知道每行中出现“CHARLES”一词的频率 基于我的例子,我想获得类似于此的输出:

[1] 1  
[2] 1  
[3] 3  
[4] 1  
[5] 2  

我想到了这个:

> table(A)  
Error in table(A) : all arguments arguments must have same length  
> sum(A)  
Error in sum(A) : invalid 'type' (list) of argument  

但不幸的是,我不知道如何应对这些错误信息并且不知道替代方案 我知道列表的行数是:

> length(A)  
[1] 5  

但不幸的是,这并没有回答我的问题。我也找不到任何其他答案 因此,我想请你帮我计算这两项措施!

非常感谢您提前!

3 个答案:

答案 0 :(得分:6)

sapply(A, function(x) length(x))
[1] 4 3 8 1 2
un <- unique(unlist(A))
nm <- lapply(un, function(x) sapply(A, function(y) sum(y == x)))
names(nm) <- un
nm
$JAMES
[1] 2 0 0 0 0

$CHARLES
[1] 1 1 3 1 2

$RICHARD
[1] 1 0 0 0 0

$JOHN
[1] 0 1 0 0 0

$ROBERT
[1] 0 1 0 0 0

$WILLIAM
[1] 0 0 3 0 0

$MICHAEL
[1] 0 0 1 0 0

$DAVID
[1] 0 0 1 0 0

答案 1 :(得分:6)

您应该熟悉lapplysapply来循环列表:

sapply(A, length)
[1] 4 3 8 1 2

sapply(A, function(x)sum(grepl("CHARLES", x)))
[1] 1 1 3 1 2

grepl()的作用是将正则表达式与文本匹配,并根据是否匹配返回TRUE或FALSE。然后我对这些逻辑值进行sum(),即将TRUE值相加。

答案 2 :(得分:3)

用于计算列表A的元素长度。您可以使用以下命令:

list.len <- lapply(1:length(A),function(x) length(A[[x]]))
unlist(list.len)
[1] 4  
[2] 3  
[3] 7  
[4] 1  
[5] 2  

用于计算“CHARLES”出现在列表的每个元素中的次数,您可以执行以下操作:

len.name <- lapply(1:length(A),function(x) length(which(A[[x]] == "CHARLES")))
len.name
[[1]]
[1] 1

[[2]]
[1] 1

[[3]]
[1] 3

[[4]]
[1] 1

[[5]]
[1] 2

然后你可以取消列出

unlist(len.name)

然后你会得到输出:

[1] 1  
[2] 1  
[3] 3  
[4] 1  
[5] 2