首页 > 解决方案 > 应用返回奇怪的结果

问题描述

我有像这样的数据框

df <- data.frame(ruleA = c('N', 'N', -1), ruleB = c(0, 0, -1))

其中元素'N'通过规则A,元素0通过规则B,我想逐行应用一个函数来查看每个观察(行)是否通过了所有规则。

一开始我试过

apply(df, 1, function(x) all(x %in% c('N', 0)))

我期待(TRUE, TRUE, FALSE),但它实际上返回(FALSE, FALSE, FALSE)

问题是当我尝试

apply(df[1:2, ], 1, function(x) all(x %in% c('N', 0)))

它返回(TRUE, TRUE)。为什么会发生这种情况?

然后我尝试了更多

apply(df, 1, function(x) x %in% c('N', 0))

并期待

(TRUE, TRUE, FALSE)
(TRUE, TRUE, FALSE)

但它返回

(TRUE, TRUE, FALSE)
(FALSE, FALSE, FALSE)

再次,当我df[1:2, ]只申请时,它会返回正确的结果。元素 0 出了什么问题?请任何人帮助。

似乎将 -1 替换为 1-9 避免了空格,那么应用过程中涉及的数字如何?

标签: rapply

解决方案


项目编号 2c('N', 0)不是数字。强制为“0”。“0”与 不同0。虽然0 == "0" returnsTRUE ,same(0, "0") 返回FALSE. 该apply函数将始终强制转换为普通类。

有一个问题,我不清楚起源。看看这个:

apply(df,1,str)
 Named chr [1:2] "N" " 0"
 - attr(*, "names")= chr [1:2] "ruleA" "ruleB"
 Named chr [1:2] "N" " 0"
 - attr(*, "names")= chr [1:2] "ruleA" "ruleB"
 Named chr [1:2] "-1" "-1"
 - attr(*, "names")= chr [1:2] "ruleA" "ruleB"

由于某种原因,0对字符的强制增加了一个额外的空间。


推荐阅读