【发布时间】:2023-02-01 00:45:25
【问题描述】:
过滤数据集时,您可以使用:
df[df$column==value,]
或者
df[which(df$column==value),]
第一个过滤器返回一个逻辑向量。第二个返回索引列表(在该逻辑向量中值为“True”的索引)。我应该用一个比另一个更好吗?我看到有时第一个返回所有值为 NA 的行......
两种表达方式哪个更正确?
谢谢!
【问题讨论】:
标签: r
过滤数据集时,您可以使用:
df[df$column==value,]
或者
df[which(df$column==value),]
第一个过滤器返回一个逻辑向量。第二个返回索引列表(在该逻辑向量中值为“True”的索引)。我应该用一个比另一个更好吗?我看到有时第一个返回所有值为 NA 的行......
两种表达方式哪个更正确?
谢谢!
【问题讨论】:
标签: r
你应该(几乎)总是喜欢第一个版本。
为什么?因为它更简单。不要给你的代码增加不必要的复杂性——编程已经够难了,我们不想让它变得更难;和小的复杂性以超线性方式相互叠加。
您可能想要使用 which 的一种情况是当您的输入包含您想要忽略的 NA 时:
df = data.frame(column = c(1, NA, 2, 3))
df[df$column == 1, ]
# 1 NA
df[which(df$column == 1), ]
# 1
然而,即使在这种情况下我不会使用which;相反,我会处理 NA 的存在明确地记录代码期望 NAs 和想要来处理它们。这个想法再次是使代码尽可能简单和不言自明。这意味着明确您的意图,而不是将其隐藏在不明显的功能后面。
也就是说,在存在 NA 的情况下,我将使用以下内容而不是 which:
df[! is.na(df$column) & df$column == 1, ]
【讨论】: