在R data.table中使用as.numeric作为0或1值生成器强制NA不应该在哪里

时间:2016-09-07 03:22:55

标签: r dataframe type-conversion data.table

在R data.table中我有这个表:

  Company <- c ("A", "A" , "A", "A", "B" , "B", "B", "B")
  TopManger <- c(1, 1, 1, 0, 1, 1, 0, 0)
  Salary <- c(300, 300, 300, NA, 250,250, NA, 100)
  tbl = data.table(company, TopManger, Salary)

看起来像:

    Company TopManger Salary
1:       A         1    300
2:       A         1    300
3:       A         1    300
4:       A         0     NA
5:       B         1    250
6:       B         1    250
7:       B         0     NA
8:       B         0    100

我执行此查询:

tbl[, HighPayedComp := as.numeric(Salary[TopManger == 1] > 200), by=Company]

我希望得到这个:

   Company TopManger Salary HighPayedComp
1:       A         1    300             1
2:       A         1    300             1
3:       A         1    300             1
4:       A         0     NA             1
5:       B         1    250             1
6:       B         1    250             1
7:       B         0     NA             1
8:       B         0    100             1

在这个最小的例子中它可以工作但是在我的大数据中。在一些任意但固定的情况下,强制NA在逻辑上它不应该: 例如,在第5行中,NAHighPayedComp

1 个答案:

答案 0 :(得分:2)

可能是由于TopManager&#39;中存在NA。柱。只要有==NA就会返回NA。使用%in%或使用!is.na

创建其他条件可以避免这种情况
tbl[, HighPayedComp:= as.integer(salary[TopManager == 1 & 
                         !is.na(TopManager)] > 200), by = Company]

或使用%in%

tbl[, HighPayedComp:= as.integer(salary[TopManager %in% 1] > 200), by = Company]

这是因为==

的行为
v1 <- c(NA, 1, 3)
v1 ==1
#[1]    NA  TRUE FALSE

,而

!is.na(v1) & v1==1
#[1] FALSE  TRUE FALSE

负责NA元素

如果我们使用%in%,代码基本上会执行match并将其转换为逻辑(> 0L

`%in%`
#function (x, table) 
#match(x, table, nomatch = 0L) > 0L

在上面的向量中,第一个元素是NA,与==进行逻辑比较会返回NA。

?"=="

中也对此进行了描述
  

缺失值(NA)和NaN值甚至被视为不可比较   对他们自己来说,所以涉及他们的比较总会导致NA。   比较字符串时也会导致缺少值   一个在当前的排序规则区域设置中无效。

数据

tbl <- data.table(Company = rep(LETTERS[1:3], each =2), TopManager = c(1, 0, NA,
  1, 1, NA), salary = c(250, 300, 220, 180, 240, 200))