1

データフレームdfと列で、すべての行のすべてaを置き換えたいと思います。is.naa=2 <- 0

これは、次の方法で簡単に実現できます。df[is.na(df$a) | df$a==2, "a"] <- 0

これをさまざまな列(、、、など)で何度も繰り返すbのでcd関数を作成できるかどうかを確認したかっただけです。この関数を何度も繰り返し使用します。そうすれば、どの値またはどの出力を変更する必要があるかは、簡単な作業になります。

これが小さな例です。最初のデータフレーム:

df<-data.frame(
  a=sample(c(0,1,2), 10, replace=TRUE)
  )

ここでいくつかの欠落している値:

df[sample(nrow(df), 3, FALSE), "a"] <- NA

最後に、[私がすでに述べた]置換するアクション:

df[is.na(df$a) | df$a==2, "a"] <- 0

私は次の機能を試しました:

f.na<-function(df,col) df[is.na(df[,col]) | df[,col]==2, col]<-0
f.na(df, "a")

うまくいくはずなのに、なぜうまくいかないのかわかりません。私は得る:

[.data.frame(df 、、 col)のエラー:未定義の列が選択されました

$サインが使えないので、[]オンラインで読んでみてみました。あるapplyタイプの関数を使用していましたが、後でデータフレームで結果を使用できなくなりました。それで私はこの方法に頼りました。変更する必要のある列ごとに何度も繰り返すことができると思いますが、関数ソリューションがあればいいと思いました。

私が試してみるべきことを提案できますか?

4

2 に答える 2

3

エラーを再現できません。dfただし、関数内への変更にf.naはグローバルスコープがないため、関数呼び出しは目的の効果を発揮しません。代わりに、1つの解決策は、次のように、関数に変更されたオブジェクトを返すようにすることです。

set.seed(37337)
df<-data.frame(
  a=sample(c(0,1,2), 10, replace=TRUE)
)
df[sample(nrow(df), 3, FALSE), "a"] <- NA
f.na<-function(df,col) {
  df[is.na(df[,col]) | df[,col]==2, col] <- 0
  return(df)
}
(df.new <- f.na(df, "a"))
df[is.na(df$a) | df$a==2, "a"] <- 0
print(df)
于 2012-07-13T15:21:23.503 に答える
1

別の変数に格納されている名前でデータフレーム(またはリストの要素)の列にアクセスする[[]]には、単一の角かっこではなく、二重の角かっこを使用します。

ただし、実行していることについては、代わりにマクロを調べたい場合があります。この号のRnewsのマクロに関する記事と、パッケージdefmacro内の関数も参照してください。gtools

于 2012-07-13T15:33:30.510 に答える