質問

誰かが私に説明することができますか?例えば:

employee <- c("Big Shot CEO", "Programmer","Intern","Guy Who Got Fired Last Week")
salary <-   c(      10000000,        50000,       0,                           NA)
emp_salary <- data.frame(employee,salary)

# how many employees paid over 100K?
nrow(emp_salary[salary>100000,]) # Returns 2 instead of 1 -- why?

emp_salary[salary>100000,]
# returns a bogus row of all NA's (not "Guy Who Got Fired")
#        employee salary
# 1  Big Shot CEO  1e+07
# NA         <NA>   <NA>

salary[salary>100000]
# returns:
# [1] 1e+07    NA

NA > 100000 #returns NA
.

この予期せぬ行動を考えると、上記の例で100Kを超える従業員数を数えるための好ましい方法は何ですか?

役に立ちましたか?

解決

まず、あなたはおそらく最初にcbind()を望んでいません - それはあなたのすべての変数をキャラクターに強制します。

 emp_salary <- data.frame(employee,salary)
.

2つの可能な解決策:

  • subsetは、基準がNA
  • の場合を自動的に除外します。

nrow(subset(emp_salary,salary>1e5))
.

  • 結果を直接数え、na.rm=TRUE
  • を使用します。

sum(salary>1e5,na.rm=TRUE)
.

ボーガス行の後ろの論理について:

  • bigsal <- salary>1e5は、それが必要としなければならないNAを含む論理ベクトルです(NA値が基準を満たすかどうかを知る方法がないため)。
  • NAsを含む論理ベクトルを含むデータフレームの行を索引付けするとき、これはおそらく文書の最も顕著なビットです(help("[")から):

    数値、論理的または文字「NA」のインデックスが未知の要素を選択し、論理整数、数値、複素数、または文字の結果の対応する要素に「NA」を返し、リストに 'NULL'を返します。 。

help("[.data.frame")を検索し、さらに便利なものは表示できませんでした。)

覚えておくと、索引付けが行われたら、Rは、論理ベクトルがsalary列から作成されたという知識をもはや持っていないので、それが望むことができることを実行する方法はありません。他の列の値。 NAを使用してNAのすべての列に記入するという一見奇妙な動作について考える1つの方法があります.Rが行を完全に出る場合は、FALSEの基準に対応します。それを保持している場合(そしてそれが数列を維持できず、他の列を落とすことができないことを覚えておいてください)、それはTRUEである基準に対応します。基準がFALSETRUEでもない場合は、他の動作が理にかなっているのかを確認するのは難しいです...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top