2

私は少しコードに苦労しています。非常に非効率的に動作させることができますが、それを修正するためのより良い方法があるに違いないと考えました。複数の異なる変数から変数をコンパイルしようとしています。コード化された変数では、「スキップ」は特定の数値としてコード化されます (以下の例では「99」)。これらの変数のうち 10 個に基づいて、合計コスト変数を作成しようとしています。

このようにして、次のように動作する非効率的なコードを作成しました。

var1 <- ifelse(data$v1<99, data$v1, 0)  
var2 <- ifelse(data$v2<99, data$v2, 0) 
... 
var10 <- ifelse(data$v1<99, data$v10, 0) 
sumvar <- var1 + var2 + var3 + var4 + var5 + var6 + var7 + var8 + var9 + var10

sapplyコマンドを使用してこれをもう少しエレガントにしようとしましたが、うまくいきませんでした。コードが失敗する理由について、誰かがヒントや助けをくれるかどうかを確認しようとしていました。私はそれをリスト環境に入れ(cbindのような他のものを試した後、正しいと思います)、特定の呼び出しを実行しようとしましたが、エラーが発生しました。サンプルコードとして、以下を設定しました。

set.seed(1234)
data <- data.frame(x=rnorm(30), y=rnorm(30), z=rnorm(30))
data$x <- ifelse(data$x > 1, 99, data$x)
data$y <- ifelse(data$y > 1, 99, data$y)
data$z <- ifelse(data$z > 1, 99, data$z)

t.list <- list(data$x, data$y, data$z)

sumvar1 <- sapply(1:length(t.list), function(i){
    tempvar <- ifelse(t.list[i] !=99, t.list[i], 0)
    sumvar1 <- sumvar1 + tempvar
})

問題は、実際のコード (またはこのコード) を試すと、次のようになることです。

Error in storage.mode(test) <- "logical" : 
  (list) object cannot be coerced to type 'double'
Calls: sapply -> lapply -> FUN -> ifelse

明らかに私は何か間違ったことをしていますが、それが何であるかはわかりません。ifelse のヘルプファイルを見ましたが、出力されるエラーメッセージがわかりません。非効率的な方法でコードを実行するようになりましたが、R での今後のコーディングを改善する方法についてフィードバックと知識を得たいと思っています。

ありがとう!

4

2 に答える 2

4

data.frame 内のすべての変数で同じ値 (99) の場合は、data.frame 全体を一度に操作してください。

> sum(data*(data < 99))
[1] -39.68282

行の合計が必要な場合

rowSums(data*(data < 99))  # faster than apply(data*(data < 99), 1, sum)

列の合計が必要な場合

colSums(data*(data < 99))  # faster than apply(data*(data < 99), 2, sum)
于 2011-04-01T20:02:55.467 に答える
4

あなたの問題を正しく理解していれば、あなたがする必要があるのは次のことだけだと思います:

## Set any skip values to be equal to zero
data[data == 99] = 0
## Work out the row means
apply(data, 1, sum)

1 つのコメント。NA99 を 0 に設定する代わりに、R の欠損値オブジェクトを使用することを考えます。

于 2011-04-01T20:03:01.550 に答える