Как я могу получить данные столбца для добавления на основе обозначения группы, используя R? - PullRequest
2 голосов
/ 30 марта 2011

Набор данных, с которым я работаю, аналогичен приведенному ниже (хотя пример имеет гораздо меньший масштаб, данные, с которыми я работаю, составляют десятки тысяч строк), и я не смогчтобы выяснить, как заставить R сложить данные столбца на основе номера группы.По сути, я хочу, чтобы я мог получить количество зеленых (синих), синих (и) красных (ий) суммированных для всех групп 81 и 66 по отдельности, а затем иметь возможность использовать эту информацию для вычисления процентов.

txt <- "Group Green Blue Red Total
81 15 10 21 46
81 10 10 10 30
81 4 8 0 12
81 42 2 2 46
66 11 9 1 21
66 5 14 5 24 
66 7 5 2 14
66 1 16 3 20
66 22 4 2 28"

dat <- read.table(textConnection(txt), sep = " ", header = TRUE)

Я потратил много времени, пытаясь выяснить, как использовать некоторые функции самостоятельно, надеясь, что найду подходящий способ сделать это, но, поскольку я такой новыйосновной пользователь Я чувствую, что ударился о стену, которую не могу пройти без посторонней помощи.

Ответы [ 3 ]

4 голосов
/ 30 марта 2011

Один путь через aggregate. Предполагая, что ваши данные находятся в объекте x:

aggregate(. ~ Group, data=x, FUN=sum)
#   Group Green Blue Red Total
# 1    66    46   48  13   107
# 2    81    71   30  33   134
2 голосов
/ 30 марта 2011

Оба ответа выше являются прекрасными примерами того, как решить этот тип проблемы.Две другие опции существуют в reshape и plyr

library(reshape)
cast(melt(dat, "Group"), Group ~ ..., sum)

library(plyr)
ddply(dat, "Group", function(x) colSums(x[, -1]))
1 голос
/ 30 марта 2011

Я бы предположил, что ответ @ Джошуа более точный, но вы должны изучить две функции: apply и tapply.Если a является вашим набором данных, то:

## apply calculates the sum of each row
> total = apply(a[,2:4], 1, sum)
## tapply calculates the sum based on each group
> tapply(total, a$Group, sum)
 66  81 
107 134 
...