2014-12-03 24 views
0

我嘗試重新說明我的問題。 我有以下數據框架,bb1,並且我正在使用dply中的dcast進行烘焙。在這個例子中,我想通過「條件」(主題條件)來計算每個「主題」在「rt」列中有多少obersvations,但我只想要具有滿足條件的「z.score」的觀察值cretain條件。在下面的例子中,我使用了abs(z.score)> 1.5,但有時它會是1.5,有時是1,有時是2. 1.5僅僅是一個例子。同樣在下面的示例中,我計算長度,但是我還希望能夠計算平均值(例如,對於具有「z.score」的觀測值,「條件」對於每個「主體」的「rt」 「> 1.5,所以長度只是一個例子)。如何在使用dcast時獲取每個ID的value.var?

require(reshape2) 
require(dplyr) 
bb1 = data.frame(subject=c(99,99,99,99,99,11,11,11), rt=c(100,150,2,4,10,15,1,2), ac=rep(1,8), 
condition=c(1,1,2,4,3,3,4,4), z.score=c(0.2,0.3,0.2,0.3,0.3,0.2,0.2,0.2)) 

> bb1 
#  subject rt ac condition z.score 
# 1  99 100 1   1  0.2 
# 2  99 150 1   1  0.3 
# 3  99 2 1   2  0.2 
# 4  99 4 1   4  0.3 
# 5  99 10 1   3  0.3 
# 6  11 15 1   3  0.2 
# 7  11 1 1   4  0.2 
# 8  11 2 1   4  0.2 

bb1 %>% 
    group_by(subject, condition) %>% 
    summarise(n = length(rt[abs(z.score) > 1.5])) %>% 
    dcast(subject ~ condition, value.var = "n") 

# subject 1 2 3 4 
# 1  11 NA NA 0 0 
# 2  99 0 0 0 0 

我的問題是,如果我想爲每個主題計算value.var =「n」,應該如何使用dcast部分?而不是每個主題的條件?我希望在整個條件下獲得每個主題的value.var。這個acutally意味着我想要計算每一行的邊距。但是我不想獲得value.var作爲主題條件,我只想獲得邊距(即,獲取每個主題在整個條件下的value.var)並將其保存爲data.frame。 在BB1上面我想獲得這樣的

# subject rt 
# 1 11 0 
# 2 99 0 

Becaude這兩個問題(即,被檢體11和99科目)沒有任何的滿足z.score限制條件的意見,我兩者都需要得到0。

我希望我的問題現在好一點

任何幫助將不勝感激。 謝謝 Ayala

+1

你可能想要在你的例子中工作......你所有的'z.score'都是0.2或者0.3,但是你的條件是'> 1.5'。你可以用'n = sum(abs(z.score)> 1.5)'來簡化你的'summarise'。但考慮到你的1.5門檻,你的輸出是正確的。 – Gregor 2014-12-03 17:17:46

+2

你可以添加一個你想要的輸出樣子的例子嗎?可能你想添加行邊界(將'margins =「condition」'添加到'dcast'),或者你想要'dcast(subject〜。,value.var =「n」)''? – aosmith 2014-12-03 17:44:15

+0

@aosmith我重申了我的問題。我嘗試了dcast(subject〜。,value.var =「n」),但他們我得到2和4(分別用於主題11和99),我應該得到0,因爲在所有條件下他們沒有觀察那符合我的z.score限制 – ayalaall 2014-12-04 08:49:36

回答

1

它看起來就像您只想爲每個subject製作摘要數據集一樣,顯示每個主題符合z.score條件的次數。使用dplyr(爲組摘要許多選項之一):

bb1 %>% group_by(subject) %>% 
    summarise(rt = sum(abs(z.score) > 1.5)) 

Source: local data frame [2 x 2] 

    subject rt 
1  11 0 
2  99 0 

如果你真的想用dcast這一點,只是從默認length更改聚合函數sum。請注意,您可以通過在dcast的代字號右側(~)中將所需的名稱放在引號中來命名新列。

bb1 %>% group_by(subject, condition) %>% 
    summarise(n = sum(abs(z.score) > 1.5)) %>% 
    dcast(subject ~ "rt", value.var = "n", fun = sum) 

    subject rt 
1  11 0 
2  99 0 
+0

非常感謝你!你的建議正是我所需要的,我也學到了很多東西。 – ayalaall 2014-12-06 13:45:24

0

所以你只是想知道你有多少測量每個主題?我不知道我理解你在找什麼,但如果我知道了直你想要什麼,然後我只用plyr這樣的:

library(plyr) 
ddply(bb1, c("subject"), function(x) nrow(x)) 

編輯:我喜歡初學者的答案,稍作修改。如果你想與上述一些價值z.score計數主體的數量(我沒有看到任何在1.5以上,所以我使用0.2爲例),這裏有一個方法:

count(bb1[bb1$z.score > 0.2, ], "subject") 
+0

我認爲有一個'dplyr :: group_size函數'。 – 2014-12-03 17:47:42

+0

@BondedDust,正確(你需要先使用'group_by')。或者,你可以使用'count(bb1,subject)'。 – 2014-12-03 18:20:31

+0

有人打電話給'group_by'「upstream」,但我猜測隨後的'summarise'函數可能會通過摺疊行來搞亂。似乎'摘要'的結果回答了我認爲被問到的問題。像你一樣,我有點不確定目標是什麼。不幸的是,人們期望使用他們的錯誤代碼來描述期望的結果。 – 2014-12-03 18:32:37

相關問題