如何一个接一个地附加数据框以形成另一个数据框?是否包括数据框将由标准决定。
下面是一个示例数据:
d1 <- data.frame(MyGroups =sample(LETTERS,100,replace=TRUE),
MyInt = sample(c(1:20),100,replace=TRUE))
现在,我应该如何从变量MyInt均值大于10的MyGroups中选择组(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)给我解决问题的方法。
如果我正确理解您的问题,您希望按组计算平均值,并且仅将满足特定阈值的那些写入预先存在的文件。如果是这样,为什么不一次计算所有均值,对其进行子集,然后将其写出来?这里有一个可能应该分成倍数的行,但我想你会明白这一点:
write.table(
subset(
ddply(d1, "MyGroups", transform, meanval = mean(MyInt)
),
meanval > 10),
"yourcsv.csv", append = TRUE, sep = ",", col.names = FALSE
)
它比你做的要简单。如果满足条件,ddply
调用的函数可以返回数据子集,如果不符合条件,则可以返回空的 data.frame。
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
。