在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行中,NA
为HighPayedComp
。
答案 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))