2016-02-16 7 views
1

У меня есть большая база данных более 85 000 значений для более чем 100 различных компаний, помеченных более чем 100 переменными. Моя цель - определить описательную статистику (среднее значение, стандартное отклонение, min max и количество значений), соответствующее нескольким переменным.Экспорт описательной статистики строк значений в лист Excel из R

Ниже приведен набор информации на одной конкретной компании, которую я буду называть компании F.

Attendance Number of representatives Number of Presenters  Company Audience 
29   2       30      2 
20   3       30      4 
30   10       20      5 
40   20       10      5 
10   30       13      5 

То, что я ищу, чтобы сделать это, чтобы иметь R вычислить описательные статистики [среднее значение, стандартное отклонение, мин, макс] и для каждого из этих конкретных столбцов и экспортировать его в Excel следующим образом:

Company F Average Number of Attendance Standard Deviation of Number of Attendance Min Number of Attendance Max Number of Attendance and Number of People in Attendance Average of Number of Representatives Standard Deviation of Number of Representatives Min of Number of Representatives Max Number of Representatives Total Number of Values Average Number of Presenters Standard Deviation Number of Presenters Min Number of Presenters Max Number of Presenters Total Number of Presenters Average Company Audience Standard Deviation Company Audience Min Number of Company Audience Max Number of Company Audience Total Number of Company Audience 

Потому что это такой длинный ряд, я суммировать это, говоря, что я пытаюсь найти описательную статистику [среднее, стандартное отклонение, min, max и n ] каждого из этих столбцов. Они все должны соответствовать компании F.

Как я пытался решить эту проблему:

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

library(psych) 
describe(CompanyF$Attendance) 
describe(CompanyF$NumberofRepresentatives) 
describe(CompanyF$Number_of_Presenters 
describe(CompanyF$Company Audience) 

С помощью пакета я был в состоянии получить dataframes, а затем перейти в Excel и построить строки вручную, вводя значения, которые я получил и опуская любую информацию, предоставленную . пакет библиотеки псих, который не соответствует тому, что я был заинтересован в Ниже приведен пример типа информации, которую я получил из пакета: психологически

vars n mean sd median trimmed mad min max range skew kurtosis se 
1 1 559 2.02 2.21  1 1.75 1.48 0 9  9 0.78 -0.65 0.09 

Этот процесс очень трудоемкий и открыта для ошибки. По завершении работы для компании F я затем создаю новую строку в Excel только под одной для компании F, но на этот раз для другой компании, такой как компания G, после чего я продолжаю процесс поиска описательной статистики [среднее, стандартное отклонение, мин. , max и n] для каждой из представляющих интерес переменных (посещаемость, количество представителей, количество докладчиков и аудитория компании).

Я искал различные решения, один из которых произошел из этого переполнения стека Export data from R into Excel, но мне не удалось найти объяснение того, как импортировать из R строки за строкой информацию в Excel, а также как указать, что она идентифицирует описательной статистики, которую я перечислил выше.

В идеале, я бы следующий вывод помещается в Excel:

Company F Average Number of Attendance Standard Deviation of Number of Attendance Min Number of Attendance Max Number of Attendance and Number of People in Attendance Average of Number of Representatives Standard Deviation of Number of Representatives Min of Number of Representatives Max Number of Representatives Total Number of Values Average Number of Presenters Standard Deviation Number of Presenters Min Number of Presenters Max Number of Presenters Total Number of Presenters Average Company Audience Standard Deviation Company Audience Min Number of Company Audience Max Number of Company Audience Total Number of Company Audience 
Company G Average Number of Attendance Standard Deviation of Number of Attendance Min Number of Attendance Max Number of Attendance and Number of People in Attendance Average of Number of Representatives Standard Deviation of Number of Representatives Min of Number of Representatives Max Number of Representatives Total Number of Values Average Number of Presenters Standard Deviation Number of Presenters Min Number of Presenters Max Number of Presenters Total Number of Presenters Average Company Audience Standard Deviation Company Audience Min Number of Company Audience Max Number of Company Audience Total Number of Company Audience 
Company H Average Number of Attendance Standard Deviation of Number of Attendance Min Number of Attendance Max Number of Attendance and Number of People in Attendance Average of Number of Representatives Standard Deviation of Number of Representatives Min of Number of Representatives Max Number of Representatives Total Number of Values Average Number of Presenters Standard Deviation Number of Presenters Min Number of Presenters Max Number of Presenters Total Number of Presenters Average Company Audience Standard Deviation Company Audience Min Number of Company Audience Max Number of Company Audience Total Number of Company Audience 

и так далее.

Сырое подмножество моих данных ниже:

structure(list(sn = structure(c(2L, 2L, 3L, 5L, 2L, 7L, 1L, 9L, 
1L, 9L, NA, 9L, 1L, 26L, 11L, 9L, 7L, NA, NA, 7L, 17L, 9L, NA, 
21L, 7L, 17L, 7L, 7L, 16L, 7L, 7L, 7L, 7L, 26L, 7L, 6L, 26L, 
22L, NA, NA, 11L, 23L, 23L, 26L, NA, 7L, 23L, 1L, NA, 1L, 7L, 
11L, 12L, 13L, 9L, NA, 15L, NA, 20L, 15L, NA, 17L, 5L, NA, 22L, 
15L, NA, NA, 5L, 8L, 32L, 29L, 23L, 33L, 1L, 23L, 14L, 6L, 7L, 
15L), .Label = c("Broome Street", "Company A", "Company B", "Company BC", 
"Company C", "Company CC", "Company D Clinton", "Company DD", 
"Company E", "Company ED BroadCompany", "Company G", "Company H  
BroadCompany", 
"Company I BroadCompany", "Company I Studio", "Company J", "Company K", 
"Company L", "Company M", "Company M BroadCompany", "Company M HS  
BroadCompany", 
"Company MCC BroadCompany", "Company N", "Company P", "Company Q", 
"Company Q Company N", "Company Q Company ZZ", "Company R - Company ZZ", 
"Company SLab", "Company Z", "Company ZE", "Company ZED", "Company ZEQ", 
"Company ZZ", "Company ZZQ", "Company ZZQ Company N"), class = "factor"), 
earn_tot = c(21.85, 20.8, NA, 8.16, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, 7.16, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, 43.32, NA, 30.48, NA, NA, 34.9, NA, NA, NA, NA, NA, 25.82, 
40.75, NA, NA, NA, NA, NA, NA, NA, NA, NA, 0, NA, NA, NA, 
30, NA, NA, NA, NA, NA, NA, 39.1, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, 52.29, 44.32, NA, 7, 38.32, 0, NA, NA, 8.25, 
NA, NA), earn_and_current_tot = c(29.43, 20.8, NA, 8.16, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, 7.16, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, 49.9, NA, 37.56, NA, NA, 41.98, 
NA, NA, NA, NA, NA, 37.32, 49, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, 0, NA, NA, NA, 37, NA, NA, NA, NA, NA, NA, 47.68, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 57.29, 48.48, NA, 
7, 45.9, 0, NA, NA, 15.75, NA, NA), pass_99 = c(0L, 0L, NA, 
NA, NA, NA, 1L, NA, NA, NA, NA, 5L, NA, 0L, NA, 5L, NA, NA, 
NA, 0L, NA, NA, NA, NA, NA, 1L, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, 0L, NA, NA, NA, NA, 5L, NA, NA, NA, NA, 4L, 0L, 
NA, NA, NA, 4L, 4L, NA, NA, NA, NA, NA, NA, 0L, NA, NA, NA, 
NA, 1L, NA, NA, NA, NA, 1L, NA, NA, 0L, 4L, 0L, NA, NA, 0L, 
NA, NA), pass_65 = c(0L, 0L, 5L, 0L, 6L, NA, 0L, 5L, NA, 
5L, NA, 6L, NA, 0L, 5L, 2L, NA, NA, NA, 0L, 5L, 5L, NA, NA, 
NA, 0L, NA, 1L, 4L, 7L, 5L, 5L, 7L, 0L, 5L, NA, 0L, 1L, NA, 
NA, NA, 2L, 0L, 6L, NA, 8L, 2L, 0L, NA, 4L, 0L, 1L, 3L, NA, 
NA, NA, NA, NA, 4L, 0L, NA, 5L, 7L, NA, 0L, NA, NA, NA, 5L, 
0L, 5L, 4L, 0L, 2L, 0L, 0L, 7L, 0L, NA, 5L)), .Names = c("sn", 
"earn_tot", "earn_and_current_tot", "pass_99", "pass_65"), row.names = c(NA, 
80L), class = "data.frame") 

Есть четыре подмножества столбцов, которые имеют наибольшее значение. Этими столбцами являются «earn_tot», «earn_and_current_tot», «pass_99» и «pass_65». Здесь перечислены многочисленные компании, анонимные. Есть около 100 компаний, с которыми я работаю. В колонке под названием «sn» есть многочисленные названия компаний. Имя всего набора подмножеств называется Subset.MergedEx.So.

Прошу прощения за то, что вы не подняли хороший воспроизводимый пример. Спасибо за терпеливость. Я читал, как построить один и использовал следующий код: dput ((голова (Subset.MergedEx.SO, 80)))

+0

Возможно [это может помочь] (http://stackoverflow.com/questions/35339532/comparing-groups-in-data-table-columns) – Jaap

+0

Спасибо за указатель. Я точно не знаю, как реализовать код для моих конкретных целей. В частности, я, возможно, пропустил информацию о том, как экспортировать строку за строкой в ​​Excel. – Dleightful

+0

Я добавил ответ. НТН. Для будущих должностей укажите [воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610).Это облегчает другим помощь вам. – Jaap

ответ

1

Это не может быть оптимальным решением, но он использовал только base и psych пакет.

Вот данные

df <- data.frame(company = rep(c("A","B", "C","D"), each = 5), 
       attendance = sample(5:10,20,TRUE), 
       representatives = sample(2:30,20,TRUE), 
       presenters = sample(20:30,20,TRUE), 
       audience = sample(50:70,20,TRUE)) 

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

get.values<-function(x){ 
    require(psych) 
    info<-describeBy(x[,2:5], group = x[,1]) 
    n.companies<-length(levels(df[,1])) 
    n<-list() 
    mean<-list() 
    sd<-list() 
    min<-list() 
    max<-list() 
    for(i in 1:n.companies){ 
     n[[i]]<-info[[i]][,2] 
     mean[[i]]<-info[[i]][,3] 
     sd[[i]]<-info[[i]][,4] 
     min[[i]]<-info[[i]][,8] 
     max[[i]]<-info[[i]][,9] 
    } 
    l<-Map(c, mean, sd, min, max, n) 
    valuedf<-do.call(rbind, l) 
return(valuedf) 
} 

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

get.names<-function(x){ 
     require(psych) 
     names<-rownames(describe(x[,2:5])) 
     avg<-character() 
     sd<-character() 
     min<-character() 
     max<-character() 
     total<-character() 
    for(i in 1:length(names)){ 
     avg[i]<-paste("average number of", names[i]) 
     sd[i]<-paste("standard deviation of", names[i]) 
     min[i]<-paste("min number of", names[i]) 
     max[i]<-paste("max number of", names[i]) 
     total[i]<-paste("total number of", names[i]) 
    } 
    cnames<-c(avg,sd,min,max,total) 
return(cnames) 
} 

Объединить значения и имена в новый dataframe:

output<-get.values(df) 
col.names<-get.names(df) 
colnames(output)<-col.names 
rownames(output)<-levels(df[,1]) 

Экспорт в Excel:

library(xlsx) 
write.xlsx(output, "descriptives.xlsx") 
+0

Это прекрасно. У меня есть выход для первой компании в файле excel с надписью «descriptives». Как получить вторую строку, отображаемую прямо под ней в той же таблице, помеченной как «descriptive.xlsx». Мой страх в том, что если я запустил его agian, он удалит первую строку и снова добавит новый набор значений. – Dleightful

+0

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

+0

У меня возникли проблемы с реализацией кода, хотя это почти наверняка проблема на моем конце: df <- mergedex (mergedex $ sn (c ("AEL", "ADL", "BKL", "CDL", "QL" ...)), mergedex $ earn_and_current_tot mergededex $ earn_tot, mergededex $ total_attend mergedex $ total_attend_rep)) mergedex является файл 39000 наблюдения с 251 переменными. Одна из переменных - «sn», которая сообщает название компании (все 94 из них я думаю). Я только решил записать пять из них выше «AEL», «ADL», «BKL», «CDL» и «QL» с эллипсисом, чтобы показать другим – Dleightful

1

Что вы можете сделать, это melt ваши данные в длинном формате, а затем преобразовать его обратно в широком формате с множеством функций агрегации:

library(data.table) 
dat.new <- dcast(melt(dat, id="company"), 
       company ~ variable, 
       fun = list(mean,sd), 
       value.var = "value") 

это дает:

> dat.new 
    company value_mean_attendance value_mean_presenters value_mean_audience value_sd_attendance value_sd_presenters value_sd_audience 
1:  A     8.0     24.8    60.6   1.870829   4.207137   7.668116 
2:  B     8.2     23.8    64.2   2.489980   2.387467   2.049390 

Теперь вы можете написать, что к Excel-файл с, например, в WriteXLS пакета:

library(WriteXLS) 
WriteXLS("dat.new","companies.xls") 

Потому что вы хотите calcutate много статистики для каждой компании, вы можете рассмотреть вопрос о написании сводной статистики для каждого п е к т в отдельный лист в вашем первенствуете-файл.

Опять же, вы преобразовываете свои данные в длинный формат с melt, затем суммируете его с lapply(.SD, function(x) list(average = mean(x), sdev = sd(x)))$value для каждой компании и каждой переменной. Разделить полученный data.table компанией в списке data.table s. Наконец написать этот список в Excel-файл:

dat.new <- melt(dat, id="company")[, lapply(.SD, function(x) list(average = mean(x), sdev = sd(x)))$value, 
            .(company,variable)] 

company.list <- split(dat.new, dat.new$company) 

WriteXLS(company.list,"companies.xls") 

Теперь у вас есть Excel-файл с отдельной вкладкой для каждой компании.


Б данные:

set.seed(21) 
dat <- data.table(company = rep(c("A","B"), each = 5), 
        attendance = sample(5:10,10,TRUE), 
        presenters = sample(20:30,10,TRUE), 
        audience = sample(50:70,10,TRUE))