3

データフレーム内の特定の列を実行し、ループを使用してすべての NA を 0 に置き換えたいと考えています。

extract = read.csv("2013-09 Data extract.csv")
extract$Premium1[is.na(extract$Premium1)] <- 0
extract$Premium1

Premium1in dataframeに必要な結果が得られextractますが、プレミアムの 27 列すべてをループしたいので、私がしようとしているのは

extract = read.csv("2013-09 Data extract.csv")

for(i in 1:27) { 
  thispremium <- get(paste("extract$Premium", i, sep="")) 
  thispremium[is.na(thispremium)] <- 0
}

を与える

Error in get(paste("extract$Premium", i, sep = "")) : 
  object 'extract$Premium1' not found

エラーの原因について何か考えはありますか?

4

2 に答える 2

2

他の要件のためにループが必要ですか? それがなくても問題なく動作するため:

extract[is.na(extract)] <- 0

一部の列のみを置換する場合は、最初にそれらの列を選択して置換を実行し、列を元のセットに戻します。

first5 <- extract[, 1 : 5]
first5[is.na(first5)] <- 0
extract[, 1 : 5] <- first5

より一般的には、特にデータ フレームを操作する場合に、R ではループをほとんど回避できます (また回避する必要があります)。多くの場合、操作は自動的にベクトル化されます (上記のように)。そうでない場合は、applyファミリの機能を使用できます。

于 2013-10-15T14:55:55.433 に答える
2

どうですか

for (colname in names(extract))
  extract[[colname]][is.na(extract[[colname]])] <- 0

(またはextract[is.na(extract)] <- 0)

または、すべての列に対して行っていない場合(質問を読み違えたと思います):

for(i in 1:27) { 
  colname <- paste0("Premium",i)
  extract[[colname]][is.na(extract[[colname]])] <- 0
}

または、そのような列の数を知る必要はありません。

premium <- grep("^Premium[0-9]*$",names(extract))
extract[premium][is.na(extract[premium])] <- 0
于 2013-10-15T14:44:56.663 に答える