如何根据R生成的表格创建新数据框?

时间:2011-07-08 21:38:26

标签: r

我得到一个包含数千行和几列的csv文件。 请参阅以下内容作为文件的示例:

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的总持续时间等。 我有很多主题标题,我不能手动输入每一个主题并要求答案。 我想找出每个主题的持续时间总和,然后创建一个新的数据框或新文件,其主题名称与总持续时间相对应。

非常感谢你提前!!!!!!

3 个答案:

答案 0 :(得分:5)

这是一个可能有用的基础版本。我借用了卡斯滕的例子。

我实际做的是根据data.frame拆分subject。这导致列表

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,这样即使存在NA,该函数仍会总结。

我在一行中提出这个

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 

答案 1 :(得分: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

答案 2 :(得分:1)

您可以使用plyr包

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

其中aa变量是您的data.frame