1. ホーム
  2. r

[解決済み】エラー - replacement has [x] rows, data has [y].

2022-02-15 16:37:43

質問

データフレーム("df")に数値列("value")があり、"valueに基づいて新しい列("valueBin")を生成したい。df$valueBinを定義する以下の条件コードを持っています。

df$valueBin[which(df$value<=250)] <- "<=250"
df$valueBin[which(df$value>250 & df$value<=500)] <- "250-500"
df$valueBin[which(df$value>500 & df$value<=1000)] <- "500-1,000"
df$valueBin[which(df$value>1000 & df$value<=2000)] <- "1,000 - 2,000"
df$valueBin[which(df$value>2000)] <- ">2,000"

次のようなエラーが発生します。

のエラー $<-.data.frame ( *tmp* , "valueBin", value = c(NA, NA, NA, : replacementは6530行、dataは6532行です。

の各要素は df$value のいずれかに適合する必要があります。 which() ステートメントを使用します。には欠損値はありません。 df$value . 最初の条件文(<=250)だけを実行しても、まったく同じエラーが発生し、次のようになります。 "...replacement has 6530 rows..." しかし、value<=250を持つレコードは6530件よりずっと少なく、valueは決してNAではありません。

このSOのリンクは、aggregate()を使用したときの同様のエラーがバグであることを指摘していますが、私が持っているRのバージョンをインストールすることを推奨しています。さらに、バグレポートには修正されたと書かれています。 R aggregate error: "replacement has <foo> rows, data has <bar>".R aggregate error: "replacement has <foo> rows, data has <bar>"

このSOのリンクの方が私の問題に関連しているようで、こちらの問題は、彼/彼女の条件ロジックの問題で、生成される置換配列の要素数が少ないというものでした。最初は "<=" の代わりに "<" またはその逆があるに違いないと思いましたが、確認してみると "value" のすべての値を重複なくカバーするためにすべて正しいことがわかりました。 R error in '[<-.data.frame'... replacement has # items, need #.

解決方法は?

を使用することができます。 cut

 df$valueBin <- cut(df$value, c(-Inf, 250, 500, 1000, 2000, Inf), 
    labels=c('<=250', '250-500', '500-1,000', '1,000-2,000', '>2,000'))

データ

 set.seed(24)
 df <- data.frame(value= sample(0:2500, 100, replace=TRUE))