R 中使用 NA 的逻辑索引 - 如何设置为 FALSE 或排除而不是 return NA?
Logical Indexing with NA in R - How to set to FALSE or exclude rather than return NA?
如果这是一个常见问题,我深表歉意,但它在我 运行 的脚本中造成了一些意想不到的挫败感。我有一个大致如下所示的数据集(尽管实际上要大得多):
df <- data.frame(A = c(1, 2, 3, NA, NA, 6),
B = c(10, 20, 30, 40 , 50, 60))
我的脚本循环遍历 A 列中的值列表,并且应该根据 B 中的值是否大于 25 来采取行动。但是,A 中缺失值对应的 B 值总是 returned,而我希望它们始终被排除在外。例如,
df$B[df$A == 6]
给出输出
NA NA 60
而不是预期
60
因此,代码
df$B[df$A == 6] > 25
returns
NA NA TRUE
而不只是
TRUE
有人可以解释这个原因和任何简单的解决方案吗?想到的直接解决方案是删除 A 列中具有 NA 值的任何行,但我更喜欢一种解决方案,该解决方案对 A 中的缺失具有鲁棒性,并且只会 return 来自 B 的单个所需逻辑值。
每当你询问N是否A可用 (NA
) value 等于 number 或 anything else - 你得到了唯一可能的答案:The answer is Not可用 (NA
).
NA
可能等于6
,或者等于John the Baptist
,或者等于⛄以及到任何其他对象。只是不可能说它是否存在,因为 值是 not available.
要得到你想要的答案,你可以在结果上使用na.omit()
或na.exclude()
。或者您可以在子集化过程中应用又一个逻辑条件:
with(df, B[A == 6 & !is.na(A)])
# [1] 60
如果这是一个常见问题,我深表歉意,但它在我 运行 的脚本中造成了一些意想不到的挫败感。我有一个大致如下所示的数据集(尽管实际上要大得多):
df <- data.frame(A = c(1, 2, 3, NA, NA, 6),
B = c(10, 20, 30, 40 , 50, 60))
我的脚本循环遍历 A 列中的值列表,并且应该根据 B 中的值是否大于 25 来采取行动。但是,A 中缺失值对应的 B 值总是 returned,而我希望它们始终被排除在外。例如,
df$B[df$A == 6]
给出输出
NA NA 60
而不是预期
60
因此,代码
df$B[df$A == 6] > 25
returns
NA NA TRUE
而不只是
TRUE
有人可以解释这个原因和任何简单的解决方案吗?想到的直接解决方案是删除 A 列中具有 NA 值的任何行,但我更喜欢一种解决方案,该解决方案对 A 中的缺失具有鲁棒性,并且只会 return 来自 B 的单个所需逻辑值。
每当你询问N是否A可用 (NA
) value 等于 number 或 anything else - 你得到了唯一可能的答案:The answer is Not可用 (NA
).
NA
可能等于6
,或者等于John the Baptist
,或者等于⛄以及到任何其他对象。只是不可能说它是否存在,因为 值是 not available.
要得到你想要的答案,你可以在结果上使用na.omit()
或na.exclude()
。或者您可以在子集化过程中应用又一个逻辑条件:
with(df, B[A == 6 & !is.na(A)])
# [1] 60