0

如何一个接一个地附加数据帧以形成另一个数据帧?是否包含数据框将由标准决定。

这是一个示例数据:

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)给我一个解决我的问题的方法。

4

2 回答 2

1

如果我正确理解您的问题,您想按组计算平均值,并且只将满足特定阈值的那些写入预先存在的文件。如果是这样,为什么不立即计算所有均值,将其子集化,然后将其写出来?这是一个可能应该分成多个班轮的班轮,但我想你会明白的:

write.table(
  subset(
    ddply(d1, "MyGroups", transform, meanval = mean(MyInt)
          ), 
    meanval > 10), 
  "yourcsv.csv", append = TRUE, sep = ",", col.names = FALSE
  )
于 2012-05-25T17:59:35.910 回答
1

它比你做的简单。如果满足条件,则调用的函数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

于 2012-05-25T18:34:07.190 回答