Как вычислить среднее значение из указанных строк и упорядочить его в R?

У меня есть набор данных типа t(USArrests):

          Alabama Alaska Arizona Arkansas California Colorado Connecticut
Murder      13.2   10.0     8.1      8.8        9.0      7.9         3.3
Assault    236.0  263.0   294.0    190.0      276.0    204.0       110.0
UrbanPop    58.0   48.0    80.0     50.0       91.0     78.0        77.0
Rape        21.2   44.5    31.0     19.5       40.6     38.7        11.1

Я хотел бы вычислить среднее значение Murder и Assault только для каждого состояния и отсортировать состояния от высокого к низкому на основе их средних значений.

Я новичок в R и не понимаю, как это сделать. Кто-нибудь может мне помочь? Спасибо!


person kin182    schedule 09.05.2017    source источник
comment
так ты хочешь mean(Murder, Assault)?   -  person Mike H.    schedule 10.05.2017


Ответы (3)


Если вы хотите, чтобы среднее значение Murder и Assault вместе (при условии, что это так, поскольку каждое состояние имеет только 1 наблюдение для каждого), вы можете сделать:

sort(colMeans(df[c("Murder","Assault"),]), decreasing = T)

Или, если ваши данные действительно не переносятся, используйте вместо этого rowMeans:

sort(rowMeans(USArrests[,c("Murder","Assault")]), decreasing = T)
person Mike H.    schedule 09.05.2017

dplyr - хорошее решение для этого. Нет необходимости t() данные.

library(dplyr)
library(tibble)
USArrests %>%
  rownames_to_column(var = "State") %>% 
  # perform operations by row
  rowwise() %>% 
  # add a column with the mean
  mutate(Mean = mean(c(Murder, Assault))) %>% 
  # should ungroup after using rowwise()
  ungroup() %>% 
  # sort by Mean descending
  arrange(desc(Mean))
person neilfws    schedule 09.05.2017

Рассмотрите возможность использования пакета data.table:

library(data.table)
DT <- data.table(cbind(USArrests), State = row.names(USArrests))
mean_stats <- DT[, list(mean_murder = mean(Murder), 
                        mean_assault = mean(Assault)), by = State]
mean_stats[order(-mean_murder, -mean_assault)]

Здесь я упорядочил результаты в порядке убывания, сначала по средней частоте убийств, а затем по средней скорости нападений. Однако, как видите, изменить это несложно. Вот пример вывода:

> head(mean_stats[order(-mean_murder, -mean_assault)])
            State mean_murder mean_assault
1:        Georgia        17.4          211
2:    Mississippi        16.1          259
3:        Florida        15.4          335
4:      Louisiana        15.4          249
5: South Carolina        14.4          279
6:        Alabama        13.2          236

Если вы новичок в R, сделайте себе одолжение и воспользуйтесь пакетом data.table. Как правило, он быстр для слияния и агрегирования и имеет компактный и понятный синтаксис.

person Jaguar    schedule 09.05.2017