R tapply сжимает результаты

Я использую tapply для сжатия большого набора данных о нескольких видах растений, выращенных в разных условиях, в четырех отдельных экспериментах. Затем tapply выдает результат, суммированный по видам. Затем я пытаюсь извлечь эти отдельные виды из выходных данных для дальнейшего анализа. Итак, tapply дает мне это (из некоторых фиктивных данных):

> tapply(results, list(trial,condition,species),mean)
> 
, , species1

       A          B           C          D
1 -0.6357911  0.6127278 -0.23812194 -0.2769131
2 -0.3851283 -0.5955274 -0.08072294 -0.7298832
3  0.2029780 -1.0282842  0.11518872 -0.6522809
4 -0.2254586  0.4215911 -0.84305584 -0.1108188

, , species2

       A           B           C           D
1 -0.4762501  0.35766102 -0.53821633 -0.64798979
2  0.0558234  0.18602479 -0.48208241  1.09532972
3 -1.0695515  0.84401536 -0.02232301 -0.02064807
4 -0.2423312 -0.02145042 -0.18834442 -0.08221573

Где я получаю среднее значение для каждого вида при каждом условии (AD), запускаю 4 отдельных эксперимента (1-4). Можно ли тогда, скажем, изолировать вид А, а затем усреднить 1-4 вида для каждого столбца?


person Jason Richardson    schedule 24.03.2017    source источник
comment
Было бы легче помочь вам, если бы вы предоставили воспроизводимый пример с примерами входных данных и желаемым результатом для этих входных данных, чтобы мы могли протестировать возможные решения.   -  person MrFlick    schedule 25.03.2017


Ответы (1)


Не совсем уверен, как ваши данные структурированы. но вот попытка.

 #Data generation function runif
 data_gen <- function() {
   x <- 
    data.frame(A=runif(4, -1.005, 1.0049),
       B=runif(4, -1.005, 1.0049),
       C=runif(4, -1.005, 1.0049),
       D=runif(4, -1.005, 1.0049))
   return(x)
  }

#Shape to similar structure
data <- list(species1=data_gen(),
         species2=data_gen(),
         species3=data_gen(),
         species4=data_gen())

#1.lapply break it up to column 1 == A 
#2.then sapply with a mean then transpose to 1 row
#3.and finally convert to data.frame
data_transf <- data.frame(t(sapply(lapply(data, '[[', 1),mean)))

#Rename columns if necessary
colnames(data_transf) <- paste0(colnames(data_transf),'_A_isolated_avg')

data_transf
person jg_r    schedule 24.03.2017