基于R中的函数附加数据帧

时间:2012-05-25 17:22:15

标签: r selection plyr

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

以下是一个示例数据:

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

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具有适当平均值的那些。