如何将组中一列中30%的最高数字相加

时间:2016-04-09 20:45:25

标签: r plyr

第一篇文章。

如标题所述。我可以使用子集函数来完成它,但我想使用ddply,这是我无法工作的。

例如,我想将所有服用安慰剂的男性的最大变化数量加起来为33.33%:-1.7,-1.5,-1.1 = 4.3,等等所有不同的组合。

要使它更复杂一点:当它没有很好地增加33.33%时(例如当有10个数据点时),我想得到平均值的一半(如果只有9个数据点,则为.25)中间的两个数字。

我的真实数据集要大得多,所以ddply会为我节省很多时间。有什么建议吗?

data <- read.table(header=TRUE, text='
 subject sex condition before after change
       1   F   placebo   10.1   6.9   -3.2
       2   F   placebo    6.3   4.2   -2.1
       3   M   aspirin   12.4   6.3   -6.1
       4   F   placebo    8.1   6.1   -2.0
       5   M   aspirin   15.2   9.9   -5.3
       6   F   aspirin   10.9   7.0   -3.9
       7   F   aspirin   11.6   8.5   -3.1
       8   M   aspirin    9.5   3.0   -6.5
       9   F   placebo   11.5   9.0   -2.5
      10   M   placebo   11.9  11.0   -0.9
      11   F   aspirin   11.4   8.0   -3.4
      12   M   aspirin   10.0   4.4   -5.6
      13   M   aspirin   12.5   5.4   -7.1
      14   M   placebo   10.6  10.6    0.0
      15   M   aspirin    9.1   4.3   -4.8
      16   F   placebo   12.1  10.2   -1.9
      17   F   placebo   11.0   8.8   -2.2
      18   F   placebo   11.9  10.2   -1.7
      19   M   aspirin    9.1   3.6   -5.5
      20   M   placebo   13.5  12.4   -1.1
      21   M   aspirin   12.0   7.5   -4.5
      22   F   placebo    9.1   7.6   -1.5
      23   M   placebo    9.9   8.0   -1.9
      24   F   placebo    7.6   5.2   -2.4
      25   F   placebo   11.8   9.7   -2.1
      26   F   placebo   11.8  10.7   -1.1
      27   F   aspirin   10.1   7.9   -2.2
      28   M   aspirin   11.6   8.3   -3.3
      29   F   aspirin   11.3   6.8   -4.5
      30   F   placebo   10.3   8.3   -2.0
 ')

2 个答案:

答案 0 :(得分:0)

不确定使用ddply会获得什么,这是一个使用基数R的建议:

mean33 <- function(x) mean(sort(x, decreasing=TRUE)[seq(1, length.out=length(x)/3)])
tapply(df$change, df$condition, mean33)
# aspirin placebo 
#   -3.18   -1.05 

为了加快速度,您可以尝试使用sort.int而不是sort - 而且ddply可以使用相同的功能。

我不太明白......

  

使它变得有点复杂:当它没有很好地添加时   33.33%(例如当有10个数据点时),我想   获得平均值的一半(如果只有9个数据点,则为.25)   中间有两个数字。

(9可以很好地除以3 ..)

...所以我没有尝试实现它。目前,使用前1/3,但如果N不能被3整除(length.out取长度(x)/ 3的整数部分),则会略微减少。

答案 1 :(得分:0)

使用dplyr(我相信更好的套餐),你可以这样做:

library(dplyr)
data %>% group_by(sex, condition) %>% arrange(desc(change)) %>% summarise(sumChange = sum(change[1:floor(n()/ifelse(n() > 10, 3, 4))]))

查看条件分数计算。您可以将其更改为您想要的任何内容。此外,您可以嵌套多个ifelse语句。

注意:你说总结......所以我使用了sum。您可以轻松替换其他函数,例如mean。还要注意你说的最高数字。所以,我做了一个降序。如果你的意思是与零的差异最大,你可以将其反转。