2016-07-05 8 views
1

私はこのようなデータフレームがあります。関数r(この場合はchull())をrのデータフレーム内のグループに適用する/ループする方法は?

x2 <- c(12,-10,-3,-5,-3, 18,-14,-3,-13,14,12,-10,-3,-5,-3, 18,-14,-3,-13,14) 
y2 <- c(-3,-4,-11,-12,-13,-4,5,-10,-3,6,-3,-4,-11,-12,-13,-4,5,-10,-3,6) 
ID2 <- c(5088,5088,5088,5088,5088,5088,5088,5088,5088,5088,6000,6000,6000,6000,6000,6000,6000,6000,6000,6000) 
D2 <- c(59,49,70,40,74,78,90,55,65,73,59,49,70,40,74,78,90,55,65,73) 
Code2 <- c(110,110,110,130,110,110,110,110,110,100,110,110,110,130,110,110,110,110,110,100) 
df2 <- data.frame(x2,y2,ID2,D2,Code2) 

df2 
    x2 y2 ID2 D2 Code2 
1 12 -3 5088 59 110 
2 -10 -4 5088 49 110 
3 -3 -11 5088 70 110 
4 -5 -12 5088 40 130 
5 -3 -13 5088 74 110 
6 18 -4 5088 78 110 
7 -14 5 5088 90 110 
8 -3 -10 5088 55 110 
9 -13 -3 5088 65 110 
10 14 6 5088 73 100 
11 12 -3 6000 59 110 
12 -10 -4 6000 49 110 
13 -3 -11 6000 70 110 
14 -5 -12 6000 40 130 
15 -3 -13 6000 74 110 
16 18 -4 6000 78 110 
17 -14 5 6000 90 110 
18 -3 -10 6000 55 110 
19 -13 -3 6000 65 110 
20 14 6 6000 73 100 
... 

xyは木のアンサンブル内の樹木のデカルト座標です。 IDは、これらのアンサンブルのそれぞれの個人識別です。 CodeおよびDはまだ関連していないパラメータです。

今アンサンブルの境界を構成するツリーのみからなるdata.frameを得るために、それぞれのアンサンブルにfuction chull()を適用しようとしています。すべてのIDのためにこのような何か:

x1 <- c(12,-10,-3,-5,-3, 18,-14,-3,-13,14) 
y1 <- c(-3,-4,-11,-12,-13,-4,5,-10,-3,6) 
ID1 <- c(5088,5088,5088,5088,5088,5088,5088,5088,5088,5088) 
D1 <- c(59,49,70,40,74,78,90,55,65,73) 
Code1 <- c(110,110,110,130,110,110,110,110,110,100) 
df1 <- data.frame(x1,y1,ID1,D1,Code1) 
hullpts <- chull(df1) 
df1[hullpts,] 

    x1 y1 ID1 D1 Code1 
6 18 -4 5088 78 110 
5 -3 -13 5088 74 110 
4 -5 -12 5088 40 130 
9 -13 -3 5088 65 110 
7 -14 5 5088 90 110 
10 14 6 5088 73 100 

私は成功せずfor()残念ながらnlme::gapply()でループを作成しようとしてきました。

私は非常に助けに感謝します。

+0

[リンク](https://stat.ethz.ch/R-manual/R-devel/library/nlme/html/gapply.html) – nic

答えて

2

私はあなたが外部のパッケージに習熟知りませんが、data.tableと、それはのような単純な関数で次のようになります。

library(data.table) 

#group by ID2 and then apply chull to x and y in each group 
#.SD just references the groups created by grouping by ID2 
#setDT converts df2 to data.table 
setDT(df2)[, .SD[chull(x2, y2),], by = 'ID2'] 
# ID2 x2 y2 D2 Code2 
#1: 5088 18 -4 78 110 
#2: 5088 -3 -13 74 110 
#3: 5088 -5 -12 40 130 
#4: 5088 -13 -3 65 110 
#5: 5088 -14 5 90 110 
#6: 5088 14 6 73 100 
#7: 6000 18 -4 78 110 
#8: 6000 -3 -13 74 110 
#9: 6000 -5 -12 40 130 
#10: 6000 -13 -3 65 110 
#11: 6000 -14 5 90 110 
#12: 6000 14 6 73 100 

それとも、基本Rを使用する場合、あなたはおそらく必要があるだろう

splits <- split(df2, df2$ID2) 
chulls <- 
    lapply(splits, function(x) { 
    x[chull(x$x2, x$y2)] 
    }) 
do.call(rbind, chulls) 
# x2 y2 ID2 D2 Code2 
#1: 18 -4 5088 78 110 
#2: -3 -13 5088 74 110 
#3: -5 -12 5088 40 130 
#4: -13 -3 5088 65 110 
#5: -14 5 5088 90 110 
#6: 14 6 5088 73 100 
#7: 18 -4 6000 78 110 
#8: -3 -13 6000 74 110 
#9: -5 -12 6000 40 130 
#10: -13 -3 6000 65 110 
#11: -14 5 6000 90 110 
#12: 14 6 6000 73 100 
+0

グレート:ような何かを!私は助けになることができてうれしい:) – LyzandeR

関連する問題