2012-06-15 160 views
3

我有一個很長的列表,其中包含不同數量的元素,這些元素也可以在同一個字段中重複出現。
這是第五行的示例:計算R中列表元素的數量和頻率?

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 

但這並不回答我的問題,很遺憾。我也找不到任何其他答案。
因此,我想問你請幫我計算這兩個措施!

非常感謝您提前!

回答

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值相加。

+1

非常感謝您提供這個簡潔而有用的回覆! – user0815

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 
+0

非常感謝,這也是非常有幫助的! – user0815

3

爲了計算列表A.You的元素可以用下面的命令的長度:

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) 

,然後你的Wi將得到的輸出爲:

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

不錯。我建議你不要使用'unlist',而是使用'sapply',它返回'lapply'的簡化版本。 – Andrie

+0

非常感謝您提供有用的解決方案! – user0815