R,筛选数据框单元格列表中的元素

时间:2019-08-16 19:42:34

标签: r

假设我有一个非常简单的数据集。我有2列,父母姓名,孩子

> d = data.frame(Parents = c("Mark", "Adam"))
> d$Children = list(c("Kid1", "Kid2"), c("Kid3", "Kid4"))
> d
  Parents   Children
1    Mark Kid1, Kid2
2    Adam Kid3, Kid4

我想做的是按Kid搜索并获得父母的名字(以及该父母名字的索引,但是我想这部分很容易)。因此,“ Kid1”将返回“ Mark”。我不知道该怎么做。

我尝试使用以下内容

which(d$Children = "Kid3")

但是它不起作用,大概是因为数据类型实际上是列表。

有没有办法解决这个问题?在这里使用数据框是个坏主意吗?我是否应该在这里使用其他数据结构,我认为在Python中我可能曾尝试使用字典,但是我不确定如何在R中解决此问题。

2 个答案:

答案 0 :(得分:2)

要过滤元素,请将lapply%in%一起使用

as.character(d$Parent)[unlist(lapply(d$Children,  `%in%`, x = 'Kid3'))]
#[1] Adam

或与Map

as.character(d$Parents)[unlist(Map(`%in%`, "Kid3", d$Children))]
#[1] Adam

输入中的列为factor类。因此,可以在提取时将其转换为character


或者另一个选择是stacksubset

subset(stack(setNames(d$Children, d$Parents)), values == "Kid3")$ind

或与dplyr/purrr

library(purrr)
library(dplyr)
d %>%
   filter(map_lgl(Children, `%in%`, x = "Kid3")) %>%
   pull(Parents)
#[1] Adam

deframe(d) %>% 
    keep(~ "Kid3" %in% .x) %>%
    names
#[1] "Adam"

答案 1 :(得分:2)

这是从基数R中使用sapply的一种方法。sapply(d$Children, ...)将匿名function(x) "Kid3" %in% x)应用于d$Children的每个元素。此函数检查每个元素中是否存在"Kid3",并每行返回一个逻辑输出。然后,此逻辑输出用于获取相应的Parent。有关更多示例,请参见?sapply。 -

d$Parent[sapply(d$Children, function(x) "Kid3" %in% x)]

[1] Adam
Levels: Adam Mark

使用dplyr-

d %>% unnest() %>% filter(Children == "Kid3")

  Parents Children
1    Adam     Kid3