2015-10-09 3 views
1

Так я изначально имел следующий объект:Merge 4 объектов данных с различными столбцами (переменные) в R

> head(gs) 
    year disturbance lek_id complex tot_male 
1 2006   N  3T Diamond  3 
2 2007   N  3T Diamond  17 
3 1981   N bare 3corners  4 
4 1982   N bare 3corners  7 
5 1983   N bare 3corners  2 
6 1985   N bare 3corners  5 

С этими словами я вычисляется общая статистика мин, макс, среднее и СКО tot_male за год в комплексе , Я использовал функции разделения данных R и назначил имена логических столбцов, где это казалось целесообразным, и в конечном итоге делало их разными объектами.

> tyc_min = aggregate(gs$tot_male, by=list(gs$year, gs$complex), FUN=min) 
> names(tyc_min) = c("year", "complex", "tot_male_min") 
> tyc_max = aggregate(gs$tot_male, by=list(gs$year, gs$complex), FUN=max) 
> names(tyc_max) = c("year", "complex", "tot_male_max") 
> tyc_mean = aggregate(gs$tot_male, by=list(gs$year, gs$complex), FUN=mean) 
> names(tyc_mean) = c("year", "complex", "tot_male_mean") 
> tyc_sd = aggregate(gs$tot_male, by=list(gs$year, gs$complex), FUN=sd) 
> names(tyc_sd) = c("year", "complex", "tot_male_sd") 

Пример вывода (второй объект - Tyc_max):

year complex tot_male_max 
1 2003      0 
2 1970 3corners   26 
3 1971 3corners   22 
4 1972 3corners   26 
5 1973 3corners   32 
6 1974 3corners   18 

Теперь мне нужно добавить количество образцов в год/комплекс комбинации, а также. Тогда мне нужно, чтобы объединить их в единый объект данных, а также экспортировать в CSV-файл

Я знаю, мне нужно использовать функцию объединения() вместе с all.y, но не имеют ни малейшего представления о том, как обрабатывать эту ошибку:

Error in fix.by(by.x, x) : 
    'by' must specify one or more columns as numbers, names or logical 

Или добавьте количество образцов в год и комплекс. Какие-либо предложения?

+1

Можете ли вы предоставить воспроизводимый пример? –

ответ

1

Это может работать (но трудно проверить без reproducible example):

gsnew <- Reduce(function(...) merge(..., all = TRUE, by = c("year","complex")), 
       list(tyc_min, tyc_max, tyc_mean, tyc_sd)) 

Но вместо того, чтобы агрегировать для отдельных статистических данных, а затем слияние, вы можете также агрегатный все сразу в новый dataframe/DataTable с, например data.table, dplyr или основания R. Тогда вам не придется сливать после (для базового R решения увидеть другой ответ):

library(data.table) 
gsnew <- setDT(gs)[, .(male_min = min(tot_male), 
         male_max = max(tot_male), 
         male_mean = mean(tot_male), 
         male_sd = sd(tot_male), by = .(year, complex)] 

library(dplyr) 
gsnew <- gs %>% group_by(year, complex) %>% 
    summarise(male_min = min(tot_male), 
      male_max = max(tot_male), 
      male_mean = mean(tot_male), 
      male_sd = sd(tot_male)) 
+0

dplyr работал отлично. Я добавил n = length (tot_male) в итоговый вызов и получил количество выборок в год на сложную комбинацию. Спасибо всем за всю большую помощь! –

+0

@SpencerHudson вместо 'n = length (tot_male)' вы также можете использовать 'n = n()' – Jaap

+0

Это имеет слишком большой смысл. Благодаря! –

1
mystat <- function(x) c(mi=min(x), ma=max(x)) 
aggregate(Sepal.Length~Species, FUN=mystat, data=iris) 

для вас:

mystat <- function(x) c(mi=min(x), ma=max(x), m=mean(x), s=sd(x), l=length(x)) 
aggregate(tot_male~year+complex, FUN=mystat, data=gs) 
Смежные вопросы