我得到一个包含数千行和几列的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的总持续时间等。 我有很多主题标题,我不能手动输入每一个主题并要求答案。 我想找出每个主题的持续时间总和,然后创建一个新的数据框或新文件,其主题名称与总持续时间相对应。
非常感谢你提前!!!!!!
答案 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)
对于数据类型,在上面的示例中,变量d
,total_durations
和result
是data.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