这是为了将akrun answer 扩展到更真实的示例,其中搜索列中的数据可能包含NA。在这种情况下,最终输出中会出现“NA”行,这很混乱,可能会混淆下游分析。在此示例中,我使用 NA 值对列 num 和 col2 进行了加标。只有col2 中的NA 有效,因为它用于搜索。这个问题的根源是任何与NA 一起操作的东西都会给出NA(例如NA == 1 = NA),除了is.na
mydf <- data.frame(num = c(1:3, NA, 5, 6), col1 = c('a', 'b', 'a', 'b', 'c', 'd'), col2 = c('A', 'b', 'A', 'B', NA, 'D'), col3 = as.character(letters)[1:6])
getrows = mydf[c("col2", "col1")] == list("A", "a") # Mixing up column orders for fun
getrows = rowSums(getrows) == 2
getrows
mydf[getrows, ] # This gives undesired NA rows
# Use which to get exact row number
which(getrows)
mydf[which(getrows),]
比较下面的输出:
> mydf <- data.frame(num = c(1:3, NA, 5, 6), col1 = c('a', 'b', 'a', 'b', 'c', 'd'), col2 = c('A', 'b', 'A', 'B', NA, 'D'), col3 = as.character(letters)[1:6])
> getrows = mydf[c("col2", "col1")] == list("A", "a") # Mixing up column orders for fun
> getrows = rowSums(getrows) == 2
> getrows
[1] TRUE FALSE TRUE FALSE NA FALSE
> mydf[getrows, ] # This gives undesired NA rows
num col1 col2 col3
1 1 a A a
3 3 a A c
NA NA <NA> <NA> <NA>
> # Use which to get exact row number
> which(getrows)
[1] 1 3
> mydf[which(getrows),]
num col1 col2 col3
1 1 a A a
3 3 a A c