2011-07-08 102 views
3

我得到一個包含數千行和幾列的csv文件。 請參閱以下內容作爲什麼樣的文件是這樣一個例子:如何根據R生成的表創建新的數據框?

Subject  Duration  
A    1.3 
B    6.7 
C    3.2 
A    2.5 
D    2.7 
E    99  
F    8.4 
G    12.5 
H    19.7 
Z    3.2 
A    56  
B    9.4 
.    .  
.    .  
.    .  

請注意,對於同一主題,持續的時間可能會有所不同。 我想合併每個特定主題的持續時間,例如,我想知道主題A的總持續時間,主題B的總持續時間等。 我有很多主題標題,我無法手動輸入每個主題並尋求答案。 我想找出每個主題的持續時間總和,然後創建一個新的數據框或一個新的文件,它的主題名稱與總持續時間相對應。

非常感謝你提前!!!!!!

回答

1

可以使用plyr包

ddply(aa, "Subject", summarise, POSITION=sum("Duration")) 

,其中AA變量是你的data.frame

2

這是包plyr被髮明瞭

#install.packages("plyr") 
library(plyr) 
d <- data.frame(
    subject=c("A", "B", "C", "A", "D", "E", "F", "G", "H", "Z", "A", "B"), 
    duration=c(1.3, 6.7, 3.2, 2.5, 2.7, 99, 8.4, 12.5, 19.7, 3.2, 56, 9.4) 
) 
f <- function(df) sum(df$duration) 
total_durations <- ddply(d, .(subject), f) 

更新任務

如果我理解你的問題,你想添加第三列,如total_duration,其中包含每個主題的所有持續時間的總和。爲此,merge函數非常有用。請注意,我將上面的計算結果保存爲新變量total_durations。現在來創建一個data.frame有三列,並將其寫入文件,做

result <- merge(d,total_durations, by="subject") 
write.csv(result, "file.csv", row.names=FALSE) 

對於數據類型,在上面的例子中,變量dtotal_durationsresultdata.frame對象。另一方面,f是描述如何處理每個主題的觀察結果的功能。其他合理的定義f將是

f <- function(df) nrow(df) # counts the observations per subject 
f <- function(df) mean(df$duration) # calculates the mean duration for each subject 
+0

非常感謝!這是超級有用!我看到這個論點產生了三列,結果是我想要的。不過,還有幾個問題,這三列是「數據框架」嗎?如果是這樣,「f」是什麼意思,我可以命名這個新的列/ data.frame?因爲我需要結果來產生其他東西,所以我需要知道它的名稱或將其轉換爲文件。再次感謝你:) – Susie

5

這是一個可能工作的基本版本。我借用了Karsten的例子。

我實際上做的是根據subject拆分data.frame。這導致列表

split(d, d$subject) 

$A 
    subject duration 
1  A  1.3 
4  A  2.5 
11  A  56.0 

$B 
    subject duration 
2  B  6.7 
12  B  9.4 

$C 
    subject duration 
3  C  3.2 

使用lapply,我通過每個列表元素和求和列duration翻轉。我添加了na.rm = TRUE,以便即使存在NAs,該函數仍然可以總結。

我在一行

lapply(split(d, d$subject), function(x) sum(x$duration, na.rm = TRUE)) 

$A 
[1] 59.8 

$B 
[1] 16.1 

$C 
[1] 3.2 

提出這個你可以unlist或將導致data.frame改造名單成更緊湊。

unlist(lapply(split(d, d$subject), function(x) sum(x$duration, na.rm = TRUE))) 
    A B C D E F G H Z 
59.8 16.1 3.2 2.7 99.0 8.4 12.5 19.7 3.2 
+6

爲什麼不'sapply(split(d $ duration,d $ subject),sum,na.rm = TRUE)'? – Marek

+0

更好。感謝您的建議。 –

相關問題