3

R * apply関数を使用して初心者向けのチュートリアルを作成する必要があります(初めてreshapeまたはplyrパッケージを使用せずに)

私はlapplyapplyデータフレームには適していないため)このデータフレームへの単純な関数を試して、名前付き列を使用してデータにアクセスしたい:

fDist <- function(x1,x2,y1,y2) {
  return (0.1*((x1 - x2)^2 + (y1-y2)^2)^0.5)  
}

data <- read.table(textConnection("X1 Y1 X2 Y2
 1 3.5 2.1 4.1 2.9
 2 3.1 1.2 0.8 4.3
 "))

data$dist <- lapply(data,function(df) {fDist(df$X1 , df$X2 , df$Y1 , df$Y2)})

私はこのエラーが発生$ operator is invalid for atomic vectorsしました。おそらく、データフレームが laply によって変更されたためです?... $という名前の列でそれを行う最良の方法はありますか?

@DWin の回答で最初の質問を解決します。しかし、混合データフレーム(数値+文字)で別の問題、誤解があります:

私の新しいユース ケースでは、2 つの関数を使用して距離を計算します。これは、目的が他のすべての Point 間の距離 Point を比較するためです。

data2 <- read.table(textConnection("X1 Y1 X2 Y2
     1 3.5 2.1 4.1 2.9
     2 3.1 1.2 0.8 4.3
     "))

data2$char <- c("a","b")

fDist <- function(x1,y1,x2,y2) {
 return (0.1*((x1 - x2)^2 + (y1-y2)^2)^0.5) 
}

fDist2 <- function(fixedX,fixedY,vec) { 
 fDist(fixedX,fixedY,vec[['X2']],vec[['Y2']])
}

# works with data (dataframe without character), but not with data2 (dataframe with character)
#ok
data$f_dist <- apply(data, 1, function(df) {fDist2(data[1,]$X1,data[1,]$Y1,df)})
#not ok
data2$f_dist <- apply(data2, 1, function(df) {fDist2(data2[1,]$X1,data2[1,]$Y1,df)})
4

2 に答える 2

10

この場合apply、必要なものです。すべてのデータ列は同じ型であり、apply が問題を引き起こす属性を失う心配はありません。長さ 4 のベクトルを 1 つだけ取るように、関数を別の方法で記述する必要があります。

 fDist <- function(vec) {
   return (0.1*((vec[1] - vec[2])^2 + (vec[3]-vec[4])^2)^0.5)  
                        }
 data$f_dist <- apply(data, 1, fDist)
 data
   X1  Y1  X2  Y2    f_dist
1 3.5 2.1 4.1 2.9 0.1843909
2 3.1 1.2 0.8 4.3 0.3982462

「データ」で列の名前を使用したい場合は、正しく綴る必要があります。

 fDist <- function(vec) {
   return (0.1*((vec['X1'] - vec['X2'])^2 + (vec['Y1']-vec['Y2'])^2)^0.5)  
                        }
 data$f_dist <- apply(data, 1, fDist)
 data
#--------    
X1  Y1  X2  Y2    f_dist
1 3.5 2.1 4.1 2.9 0.1000000
2 3.1 1.2 0.8 4.3 0.3860052

更新された(そして非常に異なる)質問は簡単に解決できます。使用するapplyと、最小の共通モード分母、この場合は「文字」に強制されます。2 つの選択肢があります: 1) 関数内のすべての引数に追加as.numericするか、2) 必要な列のみを送信します。

data2$f_dist <- apply(data2[ , c("X2", "Y2") ], 1, function(coords) 
                                       {fDist2(data2[1,]$X1,data2[1,]$Y1, coords)} )

この関数にパラメーターを渡す方法が本当に好きではありません。"[" と "$" をフォーマル リスト内で使用するのは、「間違っているように見えます」。また、「df」はデータフレームではなくベクトルになることを知っておく必要があります。これはデータフレーム (またはリスト) ではないため、「[[」ではなく「[」を使用するように内部の関数を変更する必要があります。必要な座標は 2 つだけなので、使用する 2 つの (数値) 座標のみを渡します。

于 2012-03-08T21:27:51.630 に答える