第一篇文章。
如标题所述。我可以使用子集函数来完成它,但我想使用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
')
答案 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
。还要注意你说的最高数字。所以,我做了一个降序。如果你的意思是与零的差异最大,你可以将其反转。