假设我有一个非常简单的数据集。我有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中解决此问题。
答案 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
类
或者另一个选择是stack
和subset
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