4

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

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  

除此之外,我想知道“查尔斯”一词在每一行中出现的频率。
根据我的示例,我想获得类似于此的输出:

[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  

但这并不能回答我的问题,不幸的是。我也找不到其他答案。
所以我想请你帮我计算这两个措施!

非常感谢您!

4

3 回答 3

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
于 2012-06-15T09:48:57.380 回答
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 值求和。

于 2012-06-15T09:48:59.243 回答
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  
于 2012-06-15T10:27:23.557 回答