web-dev-qa-db-ja.com

内でのifelseの使用

データセットの新しい列に、既存の列からの入力に応じて、すべての行に単一の出力を与えるようにしています。

この出力列では、「NA」が必要ですif指定された行の入力値のいずれかが「0」です。 それ以外の場合(どの入力も0でない場合)、その行の出力を入力の一意の値の数にしたい。

解決策はifelse関数をapply関数内にネストして使用すると考えていましたが、理解できないエラーが発生します。

data$output <- apply(data, 1, function(x) {ifelse(x == 0, NA, length(unique(x)))})

$<-.data.frame*tmp*、 "output"、value = c(3L、3L、3L、3L、のエラー:置換には3行、データには4行

置換が3行である理由はわかりません。適用は4行のそれぞれに同じ機能を実行するだけだと思ったからです。

8
Jordan Garner

行の変数のいずれかが0かどうかを確認したいので、ifelseステートメントで_x == 0_の代わりにany(x==0)を使用する必要があります。

_apply(data, 1, function(x) {ifelse(any(x == 0), NA, length(unique(x)))})
# [1]  1 NA  2
_

基本的にifelseは、最初の引数が長さnの場合、長さnのベクトルを返します。行ごとに1つの値が必要ですが、_x==0_で複数を渡しています(渡す値の数は、データフレームの列の数と同じです)。

データ:

_(data <- data.frame(a=c(1, 2, 3), b=c(1, 0, 1)))
#   a b
# 1 1 1
# 2 2 0
# 3 3 1
_
9
josliber

n = length(x)とします。 ifelseは、TRUEの場合はrep(NA, n)を、それ以外の場合はrep(length(unique(x)), n)を返します。したがって、applyは行列を出力します。 _data$output <- apply(..._は、_data.frame_、_data$output_の列にマトリックス(結果)を割り当てようとします。これがエラーの原因です。

出力を変数に代入するだけでコードが実行されます

out <- apply(data, 1, function(x) {ifelse(x == 0, NA, length(unique(x)))})

出力としてclass(matrix)ではなくベクトルを期待している場合は、関数のロジックに問題があります。

0
Vlo