2013-11-19 2 views
0

У меня есть список с 10 различными элементами списка, каждый из которых содержит выборку из элементов 20 завтраков, которые могут быть воспроизведены здесь ...Подсчет частоты фактора в списке()

Diet <- as.factor(rep(c("Eggs","Meat","Eggs","Milk", "Juice"),20)) 

> head(Diet) 
[1] Eggs Meat Eggs Milk Juice Eggs 
Levels: Eggs Juice Meat Milk 

для создания контура() 10 элементов списка.

breakfast <- list() 
    for (i in 1:10) { 
     breakfast[[i]] <- sample(Diet,20) 
     } 

Для каждого элемента списка 1:10 Я пытаюсь подсчитать количество раз «Яйца». Это, казалось бы, простая задача, но я должен искать неправильные ключевые слова на других сообщениях SO, поскольку мне мало помогает Goog et al.

Я думаю, что лучший вариант был бы добавить что-то вроде

NumEggs <- length(breakfast[[i]]==”Eggs” 

к петле for() но этот код является некорректным и возвращает полную длину (то есть 20), а не только длина «яйцо».

Любые предложения приветствуются.

ответ

1

Это должно работать:

> sapply(breakfast, function(x)sum(x=="Eggs")) 
[1] 10 9 11 6 9 8 8 7 7 10 
1

Если вы задаетесь вопросом, почему ваша собственная попытка не работать, это потому, что

length(breakfast[[i]]=="Eggs") 

фактически измеряя длину логического вектора, который в ваш случай всегда будет 20:

breakfast[[9]]=="Eggs" 
[1] FALSE FALSE FALSE TRUE FALSE FALSE TRUE TRUE FALSE FALSE TRUE FALSE 
[13] TRUE FALSE TRUE TRUE FALSE TRUE FALSE TRUE 

Вы можете использовать:

length(which(breakfast[[i]]=="Eggs")) 

для проверки длины вектора, выполненного только из значений TRUE. Сумма, как и user1981275, также работает, поскольку суммирование будет обрабатывать TRUE как 1 и FALSE как 0.

+0

Спасибо за полезное объяснение. –

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