R数据帧子集:在列表中查找值

R数据帧子集:在列表中查找值,r,dataframe,subset,R,Dataframe,Subset,我有一个由字符串(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"))), .

我有一个由字符串(
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$national==“MEX”,但它只返回Bob
  • df[df$national%在%“MEX”中,]
    但只返回Bob。(在%c(“MEX”)中,]
    的idem
  • df[“MEX”%in%df$national,]
    返回所有值,就像
    df[is.element(“MEX”,df$national),]
只有
df[grep(“MEX”,df$国籍),]
在工作

df["MEX" %in% df$Nationality,]


“国籍”列是长度为3的
列表。因此,我们可以在列上循环检查%
列表元素中是否有
任何
“MEX”
%,以获得逻辑
向量
,并基于该向量对行进行子集划分

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),]

如果第三个条目是“美国,墨西哥”,即
df[grep(“MEX”,df$国籍),],则使用
grep
。请使用
dput
显示示例如果您检查代码,它正在执行
子集
@akrun-yep,它会执行(因此您的代码正在解决我的问题)。非常感谢。我将编辑我的问题,以获得一个可复制的示例。实际上,我的示例并不适用。(但akrun的解决方案(
df[grep(“MEX”,df$Nationality),]
)确实如此)。我使用
dput
使其可复制,这意味着
df$national
下的值不是
c(“USA”,“MEX”)
(事实上,您不能在数据帧中存储向量值项……我忘了这一点)。正如@akrun所说,它很可能存储为单个字符串
“USA,MEX”
,其中
grep
将是获得所需结果的正确方法。谢谢。这比
grep
更符合逻辑(感谢您的解释),即使结果是相同的。
df[sapply(df$Nationality, function(x) "MEX" %in% x),]