【问题标题】:R dataframe subset: look for value in listR数据框子集:在列表中查找值
【发布时间】:2016-11-23 17:54:30
【问题描述】:

我有一个由字符串 (character) 和字符串列表组成的数据框 df。让我们举个例子:

Name       Nationality
'Alice'    "USA"
'Bob'      "MEX"
'Eve'      c("USA", "MEX")

即:

> dput(df)
structure(list(Name = c("Alice", "Bob", "Eve"), Nationality = list(    "USA", "MEX", c("USA", "MEX"))), .Names = c("Name", "Nationality"), row.names = c(1L, 2L, 3L), class = "data.frame")

如何提取具有至少“MEX”作为国籍的所有行?

预期输出:

Name       Nationality
'Bob'      "MEX"
'Eve'      c("USA", "MEX")

编辑:我试过了:

  • df[df$Nationality == "MEX", ] ,但它只返回 Bob。
  • df[df$Nationality %in% "MEX",] 但只返回 Bob 。 (同上... %in% c("MEX"),]
  • df["MEX" %in% df$Nationality,] 返回所有值,就像 df[is.element("MEX", df$Nationality),]

只有df[grep("MEX", df$Nationality), ] 工作...

【问题讨论】:

  • 如果第三个条目是“USA, MEX”,即df[grep("MEX", df$Nationality), ],则使用grep。请使用dput 显示示例
  • 如果您检查代码,它正在执行subset
  • @akrun 是的,确实如此(因此您的代码正在解决我的问题)。谢谢你!我将编辑我的问题以提供可重现的示例。

标签: r dataframe subset


【解决方案1】:

“国籍”列是长度为 3 的 list。因此,我们可以遍历列以检查是否存在 any "MEX" %in% list 元素以获得逻辑 @987654325 @ 并以此为基础对行进行子集化

df[sapply(lapply(df$Nationality, `%in%`, "MEX"), any),]
#    Name Nationality
#2  Bob         MEX
#3  Eve    USA, MEX

也可以简化为

df[sapply(df$Nationality, function(x) "MEX" %in% x),]

【讨论】:

  • 谢谢。这比grep 更合乎逻辑(并且由于您的解释而明确),即使结果相同。
【解决方案2】:
df["MEX" %in% df$Nationality,]

df[is.element("MEX", df$Nationality),]

【讨论】:

  • 实际上不适用于我的示例。 (但 akrun 的解决方案 (df[grep("MEX", df$Nationality), ]) 可以)。我使用dput 使其可重现
  • 这一定意味着df$Nationality 下的值不是c("USA", "MEX")(事实上,您不能在数据框中存储向量值条目......我忘了)。正如@akrun 所说,它很可能存储为单个字符串"USA, MEX",其中grep 将是获得所需结果的正确方法。
【解决方案3】:

一个整洁的例子:

example_tibble <-
  tibble::tibble(
    Name = c("Alice", "Bob", "Eve"),
    Nationality = list("USA", "MEX", c("USA", "MEX"))    
  )

example_tibble_filtered <- example_tibble %>% 
  dplyr::filter(
    purrr::map_lgl(
      Nationality, ~ "MEX" %in% .)
  )

【讨论】:

    猜你喜欢
    • 2015-10-24
    • 2012-06-08
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多