2

初心者Rの質問です。申し訳ありませんが、回答されていると思いますが、検索が難しいようです。var (バリアンス) のマニュアル ページを読みましたが、理解できません。チェックされた本、ウェブページ(OK、2冊だけ)。誰かが私に既存の答えを教えてくれるのを待ちます....

> df
first second
1     1      3
2     2      5
3     3      7

> df[,2]
[1] 3 5 7

> var(df[,2])
[1] 4

OK、これまでのところ、とても良いです。

> df[1,]
  first second
1     1      3
> var(df[1,])
       first second
first     NA     NA
second    NA     NA

は??

前もって感謝します。!

4

2 に答える 2

6

最初の問題は、data.frame から行を選択すると、列を選択したときとは異なるクラスのオブジェクトが取得されることです。

df = data.frame(first=c(1, 2, 3), second=c(3, 5, 7))

class(df[, 2])
[1] "integer"

class(df[1, ])
[1] "data.frame"

# But you can explicitly convert with as.integer.
var(as.integer(df[1, ]))
# [1] 2

2 番目の問題はvar()、data.frame の扱いがまったく異なることです。各列を変数として扱い、各列を他のすべての列と比較して、分散と共分散の行列を計算します。

# Create a data frame with some random data.
dat = data.frame(first=rnorm(20), second=rnorm(20), third=rnorm(20))

var(dat)
#              first     second       third
# first   0.98363062 -0.2453755  0.04255154
# second -0.24537550  1.1177863 -0.16445768
# third   0.04255154 -0.1644577  0.58928970

var(dat$third)
# [1] 0.5892897

cov(dat$first, dat$second)
# [1] -0.2453755
于 2012-06-30T02:12:25.760 に答える
1

data.frame がすべて数値であることがわかっていて、行操作と列操作の両方で使用できるようにする場合は、次のように行列に変換します。

dat = data.frame(first=rnorm(20), second=rnorm(20), third=rnorm(20))
dm <- data.matrix(df)
var(dm[1,])
#[1] 20.25

( apply() を使用すると同じ効果が発生します .... リスト構造が失われ、すべての行が最小公分母に変換されます。)

> apply(dat, 1, var)
 [1] 0.45998066 1.51241166 0.13634927 0.49981030 0.04440448 1.21224067 0.28113135 0.57968597
 [9] 0.26102036 0.41999510 1.01237100 0.17304770 0.50572223 1.17825272 1.39342510 2.94125062
[17] 1.18640684 2.15245595 3.06482195 0.96396008
于 2012-06-30T04:40:07.857 に答える