R: взвешенная сводка

У меня есть опрос, где люди сортируют животных по их популярности. Например:

"first","second","third"
"dog","cat","rabbit"
"cat","rabbit","dog"
"dog","cat","rabbit"
"dog","cat","rabbit"

Мне нужна диаграмма, показывающая порядок. Таким образом, животные в первом столбце получают вес 3, во втором - 2 и в третьем - 1.

Когда я делаю:

data<-read.csv("animals.csv", header=T)

f = summary(data$first)
s = summary(data$second)
t = summary(data$third)

В f есть массив с:

dog      cat 
  3        1

В s есть массив с:

cat      rabbit
  3           1

В t есть массив с:

dog      rabbit
  1           3

И я, очевидно, не могу:

graph = 3*f + 2*s + t

Потому что у них разные столбцы. Есть какая-то функция, как это сделать. Как составить взвешенную комбинацию этих трех столбцов?

В итоге мне нужно:

dog      cat     rabbit
 10        9          5

Я новичок в R, поэтому благодарю за помощь.


person Zerig    schedule 07.10.2015    source источник
comment
Пожалуйста, покажите взвешенную комбинацию, которую вы ожидаете, как результат вашего примера.   -  person Pierre L    schedule 07.10.2015
comment
Вы имеете в виду, что в конце хотите 10 собак, 9 кошек и 5 кроликов?   -  person Colonel Beauvel    schedule 07.10.2015


Ответы (1)


Чтобы получить взвешенные числа, вы можете:

table(c(rep(data$first, 3), rep(data$second, 2), data$third))

#   cat    dog rabbit 
#    9     10      5

данные

data <- structure(list(first = c("dog", "cat", "dog", "dog"), second = c("cat", 
"rabbit", "cat", "cat"), third = c("rabbit", "dog", "rabbit", 
"rabbit")), .Names = c("first", "second", "third"), class = "data.frame", row.names = c(NA, 
-4L))

NB: если данные импортируются с символами в качестве факторов, вы можете:

table(c(rep(as.character(data$first), 3), rep(as.character(data$second), 2), as.character(data$third)))
person Cath    schedule 07.10.2015
comment
@ user295691, возможно, но они могут быть импортированы как символы или просто заключены в as.character, если нет - person Cath; 07.10.2015
comment
Правильный результат имеет разный порядок as.character и rep: table (c (as.character (rep (data $ first), 3), as.character (rep (data $ second), 2), as.character (data $ в третьих))) - person Zerig; 07.10.2015
comment
@Zerig, извините, я не понял ваш комментарий, вы хотите, чтобы результаты были упорядочены? - person Cath; 08.10.2015
comment
Когда я использую rep (as.character ... я получаю: cat 3, dog 3, rabbit 3. Но когда я использую as.character (rep .... я получаю: cat 9, dog 10, rabbit 5) Вот и все - person Zerig; 08.10.2015