按类范围列表对数据框进行分类或剪切数据框,并用ddply进行总结
题
我对Ddply和子集有疑问。
我有这样的数据帧DF:
df <- read.table(textConnection(
" id v_idn v_seed v_time v_pop v_rank v_perco
1 15 125648 0 150 1 15
2 17 125648 0 120 2 5
3 18 125648 0 100 3 6
4 52 125648 0 25 4 1
5 17 125648 10 220 1 5
6 15 125648 10 160 2 15
7 18 125648 10 110 3 6
8 52 125648 10 50 4 1
9 56 -11152 0 250 1 17
10 15 -11152 0 180 2 15
11 18 -11152 0 110 3 6
12 22 -11152 0 5 4 14
13 56 -11152 10 250 1 17
14 15 -11152 10 180 2 15
15 22 -11152 10 125 3 14
16 18 -11152 10 120 4 6 "), header=TRUE)
第一步 :
我有一个与cut_interval相等的间隔列表:
myinterval <- cut_interval(c(15,5,6,1,17,14), length=10)
所以我在这里有两个级别:[0,10)和(10,20
第二步 :
我希望每个组/班级在v_cut中的两个级别定义...这样:
id v_idn v_seed v_time v_pop v_rank v_perco v_cut
1 15 125648 0 150 1 15 (10,20]
2 17 125648 0 120 2 5 [0,10)
3 18 125648 0 100 3 6 [0,10)
4 52 125648 0 25 4 1 [0,10)
5 17 125648 10 220 1 5 [0,10)
6 15 125648 10 160 2 15 (10,20]
7 18 125648 10 110 3 6 [0,10)
8 52 125648 10 50 4 1 [0,10)
9 56 -11152 0 250 1 17 (10,20]
10 15 -11152 0 180 2 15 (10,20]
11 18 -11152 0 110 3 6 [0,10)
12 22 -11152 0 5 4 14 (10,20]
13 56 -11152 10 250 1 17 (10,20]
14 15 -11152 10 180 2 15 (10,20]
15 22 -11152 10 125 3 14 (10,20]
16 18 -11152 10 120 4 6 [0,10)
步骤3:
我想知道x轴的v_rank的可变性,以及每个组的y轴的时间,因此我需要计算最小值,mee,max,sd for v_rank值,v_rank value for v_rank值
ddply(df, .(v_cut,v_time), summarize ,mean = mean(v_rank), min = min(v_rank), max = max(v_rank), sd = sd(v_rank))
*结果想要: *
id v_time MEAN.v_rank ... v_cut
1 0 2.25 (10,20]
2 0 2.42 [0,10)
3 10 2.25 [0,10)
4 10 2.42 (10,20]
我的问题
我不知道如何通过步骤1->步骤2:/
如果可以像步骤3中的我的示例那样按v_cut进行分组吗?
是否有可能使用ddply的“子集”选项制作相同的东西?
再一次,非常感谢您的帮助!
更新1:
我有一个答案,可以将步骤1转到步骤2:
df$v_cut <- cut_interval(df$v_perco,n=10)
我正在使用plyr,但是在这种情况下可能有更好的答案?
回答要转到步骤2到第3步?
更新2:
布兰登·贝特尔森(Brandon Bertelsen)用Melt + Cast给我一个很好的答案,但是现在(了解)我想与Plyr和ddply一起进行相同的操作。
id v_idn v_time MEAN.v_rank ... v_cut
1 15 0 2.25 (10,20]
2 15 10 2.45 (10,20]
2 17 0 1.52 [0,10)
2 17 10 2.42 [0,10)
etc.
我正在尝试这样的事情:
r('sumData <- ddply(df, .(v_idn,v_time), summarize,min = min(v_rank),mean = mean(v_rank), max = max(v_rank), sd=sd(v_rank))')
但是我想在我的sumdata dataframe中使用v_cut,我该如何处理ddply?有这样做的选择吗?或与初始df和键= v_idn合并以将列v_cut添加到sumdata是唯一的好答案?
解决方案
您真的不需要Plyr,您可以使用 reshape
## Pull what you need
dfx <- df[c("v_seed", "v_time","v_rank","v_perco")]
## Bring in your cuts
dfx <- data.frame(dfx, ifelse(df$v_perco > 10,"(10,20]", "[0,10)")))
## Rename v_cut
colnames(dfx)[ncol(dfx)] <- "v_cut"
## Melt it.
dfx <- melt(dfx, id=c("v_cut", "v_seed", "v_time"))
## Cast it.
dfx <- cast(dfx, v_cut + v_time + v_seed ~ variable, c(mean,min,max,sd))
如果您只需要平均值,请用以下方式替换最后一行。
dfx <- cast(dfx, v_cut + v_time + v_seed ~ variable, mean)
键入“ DFX”,您将看到一个数据框,其中包含所需内容。
其他提示
您只是在语法上遇到问题:
## Add your cut
df.new <- data.frame(df, ifelse(df$v_perco > 10,"(10,20]", "[0,10)"))
## Rename v_cut
colnames(df.new)[ncol(df.new)] <- "v_cut"
## Careful here read the note below
df.new <- ddply(df.new, .(v_idn, v_time), function(x) unique(data.frame(
mean = mean(x$v_rank),
v_cut = x$v_cut
)))
或者:
ddply(df.new, .(v_idn, v_time), summarise, mean=mean(v_rank))
使用“。(v_idn,v_time)”您告诉ddply,对于v_idn和v_time的每种组合,您都希望它计算V_Rank的平均值。