1. ホーム
  2. r

[解決済み] RでcolSums。x' は少なくとも2次元の配列でなければならない。

2022-02-05 05:26:10

質問

私はコーディング全般の初心者です。という名前のデータフレームから2つのパラメータを計算しようとしています。 a 行iと列jについて、Rで求めることに興味があります。

B = (j列の全値の合計) - a[i,j].

C = (i行の全値の合計) - a[i,j].

i=1 , j=2 の場合、書いている。

  A = a[1,2]
  B = (colSums(a[1:nrow(a),1],na.rm = FALSE, dims = 1) - A)
  C = (rowSums(a[1,1:ncol(a)],na.rm = FALSE, dims = 1) - A)

Cが正解のようです。しかし、Bはエラーになります。

Error in base::colSums(x, na.rm = na.rm, dims = dims, ...) : 
  'x' must be an array of at least two dimensions

他のスレッドも読みましたが、私の答えは見つかりませんでした。何かいい方法はないでしょうか?

解決方法を教えてください。

この問題は、コマンド a[1:nrow(a),1] . このコマンドは、データフレームの最初の列のすべての行を選択します。 a しかし は結果をベクトルとして返します(データフレームではありません)。関数 colSums は、(ベクトルのような)1次元のオブジェクトでは動作しません。

余談ですが、この場合 1:nrow(a) を使えば、すべての行を選択することができます。同じようにカンマの前に空の引数を指定する方が簡単です。 a[ , 1] .

データフレームの例です。

dat <- data.frame(a = 1:3, b = 4:6)
#   a b
# 1 1 4
# 2 2 5
# 3 3 6

1列を選択した場合、結果は自動的にベクトルに変換されます。

dat[ , 1]
# [1] 1 2 3

を指定した場合 drop = FALSE の場合、1列のデータフレームが返される。

dat[ , 1, drop = FALSE]
#   a
# 1 1
# 2 2
# 3 3

この1列のデータフレームは2次元のオブジェクトなので colSums .

colSums(dat[ , 1, drop = FALSE])
# a 
# 6