2014-01-02 4 views
3

У меня есть кадр данных в R, который выглядит следующим образом:Условная сумма в R и 2 условия

species sampletype content 
P1 O1   10 
P1 O2   12 
P1 O3   9 
P1 A   4 
P1 A   3 
P1 A   4 
P2 O1   21 
P2 O1   12 
P2 O2   4 
P2 O3   6 
P2 A   7 
P2 A   7 
P2 A   3 
P3 O1   15 
P3 O1   13 
P3 O1   5 
P3 O1   12 
P3 A   5 
P3 A   7 
P3 A   8 
P4 O1   12 
P4 O1   11 
P4 O2   8 
P4 O2   2 
P4 A   4 
P4 A   3 
P4 A   4 

Теперь мне нужно среднее содержание O * образцов на вид, где O1, O2 и O3 являются отдельными образцы, но повторное появление, например, O1 считается одним O1 (соответственно для O2 и O3). Таким образом, результат должен поставить что-то вроде этого:

P1 = (10+12+9)/3 
P2 = (21+12+4+6)/3 (since there is O1,O2 and O3) 
P3 = (15+13+5+12)/1 (since only O1 occurs) 
P4 = (12+11+8+2)/2 (since only O1 and O2 occur) 

Я пробовал с слиянием, агрегатом, Grep .. но я борюсь с синтаксисом и сложностью.

ответ

3

Если я правильно вас понимаю, вам не нужны строки, где sampletype равен A. Учитывая это, вы можете сделать

d <- subset(x, sampletype != "A") 
ddply(d, .(species), summarise, 
     avg=sum(content)/length(unique(sampletype))) 

    species  avg 
1  P1 10.33333 
2  P2 14.33333 
3  P3 45.00000 
4  P4 16.50000 
+1

+1 Вы правильно прочитали вопрос! Хороший ответ. –

+0

работал хорошо, просто и хорошо anwser – mace

+1

'df <- subset (x, sampletype! =" A "); by (df, df $ species, function (x) {sum (as.numeric (x [["content"]]))/length (unique (x [["sampletype"]])}) 'должно работать также где x - это имя фрейма данных –

Смежные вопросы