2015-06-19 6 views
2

Так у меня есть dataframe, PVALUES, как это:В R, как принять среднее значение для различных строк для каждой строки в кадре данных?

PVALS <- read.csv(textConnection("PVAL1 PVAL2 PVAL3 
0.1 0.04 0.02 
0.9 0.001 0.98 
0.03 0.02 0.01"),sep = " ") 

Это соответствует другому dataframe, DATA, например:

DATA <- read.csv(textConnection("COL1 COL2 CO3 
10 2 9 
11 20 200 
2 3 5"),sep=" ") 

Для каждой строки в DATA, я хотел бы взять среднее из чисел, индексы которых соответствуют записям в PVALUES, которые составляют < = 0,05.

Так, например, первая строка в PVALUES имеет только две записи < = 0,05, записи в [1,2] и [1,3]. Таким образом, для первой строки DATA, я хочу взять среднее значение 2 и 9.

Во втором ряду PVALUES, только запись [2,2] является < = 0,05, поэтому вместо того, чтобы среднее для второго ряда DATA я бы просто использовал DATA[20,20].

Итак, мой выход будет выглядеть так:

MEANS 
6.5 
20 
3.33 

Я думал, что я мог бы быть в состоянии генерировать индексы для каждой записи в PVALUES < = 0,05, а затем использовать его для выбора записи в DATA использовать для имею в виду. Я пытался использовать эту команду для создания индексов:

exp <- which(PVALUES[,]<=0.05, arr.ind=TRUE) 

... но это только поднимает на индексы для записи первого столбца, которые являются < = 0,05. В моем примере выше он выводит только [3,1].

Может ли кто-нибудь увидеть, что я делаю неправильно, или идеи о том, как решить эту проблему?

Спасибо!

+3

Вы уверены, что у вас есть выходные данные? Среднее значение 2 и 9 равно 5.5. Для последней строки, вы хотите, чтобы среднее значение 2,3 и 5 (т.е. 3,3)? – MrFlick

+0

Упс - вы правы, я его изменю –

ответ

6

Это немного смешно смотреть, но это должно работать

rowMeans(`is.na<-`(DATA,PVALUES>=.05), na.rm=T) 

«уродливый» часть звонит is.na<-, не делая автоматическую замену, но здесь мы просто установить все данные с р-значения больше, чем .05 к отсутствующему, а затем взять строку.

Непонятно, что именно вы делали с exp, но этот тип метода мог бы работать. Может быть, с

expx <- which(PVALUES[,]<=0.05, arr.ind=TRUE)  
aggregate(val~row, cbind(expx,val=DATA[exp]), mean) 

(переименовано так, чтобы не мешать встроенную exp() функции)

Испытан с

PVALUES<-read.table(text="PVAL1 PVAL2 PVAL3 
0.1 0.04 0.02 
0.9 0.001 0.98 
0.03 0.02 0.01", header=T) 

DATA<-read.table(text="COL1 COL2 CO3 
10 2 9 
11 20 200 
2 3 5", header=T) 
+0

Отличное решение - отлично работает для меня! Спасибо! –

+1

Именование объекта 'exp' делает _not_ вмешательством в функцию 'exp'. Люди навсегда назову свои данные dataframes 'или' df ', и ни одна из этих операций не влияет на работу функций с одинаковыми именами. –

1

Я обычно пользуюсь ответами MrFlick, но использование is.na<- в этой манере, кажется чтобы нарушить мои ожидания R-кода, поскольку он разрушает данные. Я признаю, что, вероятно, следовало ожидать этой возможности из-за назначения стрелки, но это все равно меня удивило. (Я не возражаю против кода data.table, потому что он изменяет его содержимое с помощью функции :=.) Я также признаю, что мои усилия по улучшению этого привели меня к кроличьей дыре, где я нашел это одинаково " барокко ".(Вы неправильно усреднили 2 и 9)

sapply(split(DATA[which(PVALS <= 0.05, arr.ind=TRUE)], 
       which(PVALS <= 0.05, arr.ind=TRUE)[,'row']), 
      mean) 

     1   2   3 
5.500000 20.000000 3.333333 
Смежные вопросы