データセットの新しい列に、既存の列からの入力に応じて、すべての行に単一の出力を与えるようにしています。
この出力列では、「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行のそれぞれに同じ機能を実行するだけだと思ったからです。
行の変数のいずれかが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
_
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)
ではなくベクトルを期待している場合は、関数のロジックに問題があります。