2012-06-15 2 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 

В дополнение к этому я хотел бы знать частоту термин «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 

Но это не ответ на мой вопрос, к сожалению. Я не мог найти и других ответов.
Поэтому я хотел бы попросить вас, пожалуйста, помочь мне рассчитать эти две меры!

спасибо, что заблаговременно!

ответ

6

Вы должны ознакомиться с lapply и sapply в петле над списками:

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

unlist(len.name) 

, а затем вы Wi Получите выход:

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

Ницца. Вместо использования 'unlist', я предлагаю вам использовать' sapply', который возвращает упрощенную версию 'lapply'. – Andrie

+0

Большое спасибо за ваше полезное решение! – user0815

Смежные вопросы