1

国勢調査データをかなり非集計データ (例: 5 歳グループの年齢変数) からセグメント化し、集計に基づいて集計変数 (例: 郡ごとに 18 歳以上のすべての男性) を作成しようとしています。私の解決策はrowSumsです。たとえばcounty$MalesOver18 <- rowSums(county[,c(68:87)])、vars 68-87の合計が18歳以上の男性に加算されます-正常に動作します。ただし、500 個の変数を使用すると、開始/終了列の順序を数えるのは効率的ではありません。

しかし、私の好みのソリューションである rowSums の列名 (例: rowSums(county[,c(H76007:H76025)]H vars = フィールド名) を使用すると、次の 2 つのメッセージ エラーのいずれかが発生します。

列名を引用符で囲んで実行: Error in "H76007":"H76025" : NA/NaN argument In addition: Warning messages: 1: In[.data.frame (county, , c("H76007":"H76025")) : NAs introduced by coercion 2: In[.data.frame(county, , c("H76007":"H76025")) : NAs introduced by coercion

引用符で囲まれていない列名で実行: Error in[.data.frame(county, , c(H76007:H76025)) : object 'H76007' not found

na.rm コマンドを使用して、変数を数値として設定しようとしましたが、それらはすでに整数ですが、すべて結果がありません。

ガイダンスはありますか?ありがとう。

4

2 に答える 2

3

列名で data.frames にインデックスを付ける場合、:演算子は使用できません。数値でこれを行うと、シーケンスが作成されます。

> 2:5
[1] 2 3 4 5

ただし、それはあなたが見ていた文字データでは機能しません:

> "foo":"bar"
Error in "foo":"bar" : NA/NaN argument
In addition: Warning messages:
...

じゃあ何をすればいいの?次の 2 つのオプションが考えられます。

  1. およびいくつかの正規表現マジックを使用greplして、返したい列名を識別します。mtcarsデータを使用した簡単な例を次に示します。

#

colsToOperateOn <- grepl("mpg|cyl", colnames(mtcars))
> head(mtcars[, colsToOperateOn], 2)
              mpg cyl
  Mazda RX4      21   6
Mazda RX4 Wag  21   6

必要な列を取得するには、必要に応じて複雑な正規表現を記述する必要があります。

  1. を使用whichして、必要な開始列と終了列のインデックスを識別し、それらをシーケンスに変換します。

#

start <- which(colnames(mtcars) == "mpg")
end <- which(colnames(mtcars) == "cyl")
> head(mtcars[, start:end], 2)
              mpg cyl
Mazda RX4      21   6
Mazda RX4 Wag  21   6

mpgcylが隣り合っているため、これは悪い例かもしれませんが、要点を証明する必要があります。

于 2013-05-02T03:11:31.227 に答える