如何一个接一个地附加数据帧以形成另一个数据帧? 是否包括数据帧将由标准决定。
以下是一个示例数据:
d1 <- data.frame(MyGroups =sample(LETTERS,100,replace=TRUE),
MyInt = sample(c(1:20),100,replace=TRUE))
现在,如何从MyGroups中选择具有变量MyInt大于10的平均值的组(A,B,C ......)?
我尝试了以下但没有成功。在这里,我将数据框附加到基于给定标准的文件中。
require("plyr")
keepGrp <- function(df0) {
if(max(df0$MyInt < 10)) {df0 <- NULL}
write.csv(df0,'mytable.txt',append=TRUE,sep=',')
}
ddply(d1,.(MyInt),function(x) keepGrp(x))
所需的数据框应位于文件mytable.txt中 我完全相信有更好的方法可以做我想做的事情。 如果我需要这样做,我很乐意澄清我的问题。 我会很感激有人可以(1)向我展示改进我的编程思想的反馈(2)给我一个解决我问题的方法。
答案 0 :(得分:1)
如果我正确理解您的问题,您希望按组计算平均值,并仅将符合特定阈值的那些写入预先存在的文件。如果是这样,为什么不一次计算所有的手段,子集,然后写出来?这是一个应该分成倍数的单线,但我认为你会明白这一点:
write.table(
subset(
ddply(d1, "MyGroups", transform, meanval = mean(MyInt)
),
meanval > 10),
"yourcsv.csv", append = TRUE, sep = ",", col.names = FALSE
)
答案 1 :(得分:1)
它比你制作它简单。 ddply
调用的函数可以在满足条件时返回数据子集,如果不符合则可以返回空数据框。
keepGrp <- function(df0) {
if(mean(df0$MyInt) > 10) {
df0
} else {
data.frame()
}
}
res <- ddply(d1, .(MyGroups), keepGrp)
请注意,keepGrp
中的测试错误(未测试MyInt
值的平均值)且ddply
的分组错误(应为MyGroups
},而不是MyInt
)。
检查这是否正确:
> ddply(d1, .(MyGroups), summarise, ave = mean(MyInt))
MyGroups ave
1 A 14.200000
2 B 9.600000
3 C 5.600000
4 D 5.600000
5 E 8.000000
6 F 10.500000
7 G 7.333333
8 H 12.000000
9 I 7.333333
10 J 9.500000
11 K 11.000000
12 L 12.375000
13 M 13.250000
14 N 12.000000
15 O 11.666667
16 P 8.625000
17 Q 13.000000
18 R 6.000000
19 S 16.000000
20 T 12.000000
21 U 12.000000
22 V 13.250000
23 W 17.666667
24 X 9.000000
25 Y 12.400000
26 Z 13.750000
> unique(res$MyGroup)
[1] A F H K L M N O Q S T U V W Y Z
Levels: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
res
中显示的那些是MyInt
具有适当平均值的那些。