基于 R 中的函数追加数据框



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

下面是一个示例数据:

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

最新更新