2016-10-26 10 views
1

У меня есть большой набор данных, для которого мне нужно создать несколько перекрестных таблиц. Это, в частности, двумерные таблицы для генерации частот вместе со средним значением и SD.Создайте кросс-таблицу в R со средним значением и SD

Так дайте пример у меня ниже данные -

City <- c("A","B","A","A","B","C","D","A","D","C") 
Q1 <- c("Agree","Agree","Agree","Agree","Agree","Neither","Neither","Disagree","Agree","Agree") 
df <- data.frame(City,Q1) 

Keeping данные в виду, я хочу, чтобы создать перекрестную таблицу со средним значением, как показано ниже -

City    
     A B C D 
Agree 3 2 1 1 
Neither   1 1 
Disagree 1   
Total 4 2 2 2 
Mean 2.5 3 2.5 2.5 

При генерации означает, что Соглашению дается вес 3, Ни один вес не равен 2, а Не согласен - задан вес 1. Результат кросс-таблицы должен иметь среднее значение чуть ниже столбца Total. Было бы неплохо иметь сетчатые линии между каждым столбцом и строкой.

Можете ли вы предложить, как достичь этого в R?

ответ

0

Вот возможное решение с использованием addmargins, который позволяет передавать предопределенные функции вашего table результата

wm <- function(x) sum(x * c(3, 1, 2))/sum(x) 
addmargins(table(df[2:1]), 1, list(list(Total = sum, Mean = wm))) 

#   City 
# Q1   A B C D 
# Agree 3.0 2.0 1.0 1.0 
# Disagree 1.0 0.0 0.0 0.0 
# Neither 0.0 0.0 1.0 1.0 
# Total 4.0 2.0 2.0 2.0 
# Mean  2.5 3.0 2.5 2.5 

Если вы хотите SD, вы можете просто добавить , SD = sd к списку функций

+0

Спасибо Дэвид! Любая идея, как добавить линии сетки, чтобы улучшить внешний вид вывода? –

0

Вот решение:

x <- table(df$Q1, df$City) #building basic crosstab 
#assigning weights to vector 
weights <- c("Agree" = 3, "Disagree" = 1, "Neither" = 2) 
#getting weighted mean 
weightedmean <- apply(x, 2, function(x) {sum(x * weights)/sum(x)}) 
#building out table 
x <- rbind(x, 
      apply(x, 2, sum), #row sums 
      weightedmean) 
rownames(x)[4:5] <- c("Total", "Mean")