0

data.frameがあり、1つの列を他の列に対して使用して相関係数を計算したいと思います(フレームには数値以外の列もいくつかあります)。

ddply(Banks,.(brand_id,standard.quarter),function(x) { cor(BLY11,x) })
# Error in cor(BLY11, x) : 'y' must be numeric

is.numeric(x)に対してテストしました

ddply(Banks,.(brand_id,standard.quarter),function(x) { if is.numeric(x) cor(BLY11,x) else 0 })

しかし、それはすべての比較に失敗し、0を返し、1回だけ呼び出されたかのように、1つの列のみを返しました。関数に何が渡されていますか?Rに来たばかりで、私が欠けている根本的な何かがあると思います。

ありがとう

4

5 に答える 5

5

このようなものを試してください

cor(longley[, 1], longley[ , sapply(longley, is.numeric)])



    GNP.deflator       GNP Unemployed Armed.Forces Population      Year  Employed
[1,]            1 0.9915892  0.6206334    0.4647442  0.9791634 0.9911492 0.9708985
于 2012-08-29T17:02:52.037 に答える
5

?corから:

'x'と'y'が行列の場合、'x'の列と'y'の列の間の共分散(または相関)が計算されます。

したがって、実際の仕事は、数値以外の列を削除することだけです。

# An example data.frame containing a non-numeric column
d <- cbind(fac=c("A","B"), mtcars)

## Calculate correlations between the mpg column and all numeric columns
cor(d$mpg, as.matrix(d[sapply(d, is.numeric)]))
     mpg       cyl       disp         hp      drat         wt     qsec
[1,]   1 -0.852162 -0.8475514 -0.7761684 0.6811719 -0.8676594 0.418684
            vs        am      gear       carb
[1,] 0.6640389 0.5998324 0.4802848 -0.5509251

編集:実際、@ MYaseen208の回答が示すように、data.framesを明示的に行列に変換する必要はありません。次の両方が問題なく動作します。

cor(d$mpg, d[sapply(d, is.numeric)])

cor(mtcars, mtcars)
于 2012-08-29T16:59:50.493 に答える
2

ddplyは、data.frameをチャンクに分割し、それら(小さいdata.frames)を関数に送信します。yourxは、と同じ列を持つdata.frameBanksです。したがって、is.numeric(x)ですFALSEis.data.frame(x)を返す必要がありTRUEます。

試す:

function(x) { 
  cor(x$BLY11, x$othercolumnname) 
}
于 2012-08-29T16:24:31.040 に答える
2

この関数はチャンクで動作します:

calc_cor_only_numeric = function(chunk) {
   is_numeric = sapply(chunk, is.numeric)
   return(cor(chunk[-is_numeric]))
 }

そして、によって使用することができますddply

ddply(banks, .(cat1, cat2), calc_cor_only_numeric)

コードを確認できませんでしたが、これで開始できます。

于 2012-08-29T16:51:31.890 に答える
1

あなたがしていることもsapply同様に行うことができるようです:

with(Banks,
  sapply( list(brand_id,standard.quarter), function(x) cor(BLY11,x) )
)
于 2012-08-29T16:37:30.027 に答える