【问题标题】:Subset a data frame using a vector, including NAs使用向量对数据框进行子集化,包括 NA
【发布时间】:2020-04-14 17:13:55
【问题描述】:

我想获取数据框行的子集,其中一个列等于向量中的值,其中向量或数据框列都可以有 NA。我想在 NA 上包含一个匹配项,但前提是列和向量都具有 NA。 (仅供参考,这是一个labeller function,它获取一个向量作为参数。)

一些数据:

df1 <- data.frame(x_var_value=c('a', 'b', NA), num=c(1,2,3))
v2 <- c('a', 'b')

一些尝试从df1 中选择行不起作用的示例,其中x_var_value == v2

df1[df1$x_var_value == v2]$x_var_value

df1[(df1$x_var_value == v2) | (is.na(df$x_var_value) & is.na(v2))]$x_var_value

library(tidyverse)
df1 %>% filter(x_var_value == v2)

我应该能够使用来自herehere 的答案,但不知何故它让我无法理解。

编辑:我认为标注函数可能希望输出与输入的顺序相同。如果是这样,我需要v2 order 中的匹配。

编辑 2:我也不知道 labeller 函数是否会多次获得传递的变量值。应该不会吧?

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    我认为问题在于== v2 将 x_var_value 与向量进行比较,而不是单个值,因此您需要检查该值是否为 in 而不是 equal到 v2

    df1[df1$x_var_value %in% v2,]
    

    如果 v2 包含 NA,例如v2 &lt;- c('a', NA) 那么它将包含该列中具有 NA 的行。

    【讨论】:

    • 我认为这个答案将按 df1 的顺序返回这些。我想我需要这些按 v2 的顺序? (编辑了问题。)我还想知道是否可以使用具有两次 var 值的向量调用 labeller 函数(即v2=c('a', 'b', 'a', 'b')。我不太了解 labeller 接口。
    【解决方案2】:

    你不是在找match吗?

    df1[match(v2, df1$x_var_value),]
    #>   x_var_value num
    #> 1           a   1
    #> 2           b   2
    

    【讨论】:

    • 这个问题有点模棱两可——如果data.frame的列包含多个a,那么这种方法只会返回第一个。从这个问题中不清楚是应该返回全部还是只返回第一个。
    • 好点@GavinKelly。您使用 %in% 的方法对于多个匹配项会更好。
    • 好点。我不知道 labeller 函数的行为,它是否可以传入多个相同的值。另外,它是否需要与原始参数相同的顺序返回值(它可能需要),这让我对%in%持怀疑态度。
    • 注意:这个匹配答案为我返回了两行所有 NA,因为匹配本身返回所有 NA。
    • @dfrankow 为什么你的匹配项是“NA”?
    【解决方案3】:

    data.table 的另一个选项

    library(data.table)
    setDT(df1)[as.character(x_var_value) %chin% v2]
    

    【讨论】:

    • 谢谢!这对我不起作用:imgur.com/a/SPq2kL0。但是,我不太可能使用 data.table,因为我想坚持使用 tidyverse。
    • 哦,我的错,不是col_value。仍然无法使用正确的 var 名称:imgur.com/a/aNq78Td
    • @dfrankow 你有一个因子列,转换为字符。请检查我的更新
    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多