Проверьте, находится ли значение в массиве значений в r - PullRequest
1 голос
/ 13 апреля 2019

У меня есть датафрейм с двумя столбцами Fruits и Groups.Я хочу проверить, является ли значение в Fruits массивом в Groups.Если да, измените новое поле и добавьте да или нет.

df <- data.frame(Fruits = c("Apple","Banana","Orange","Kiwi"),
                 Group = I(list(c("Apple","Strawberry"), 
                                c("Orange","Kiwi"),
                                c("Apple","Banana"),
                                c("Apple","Kiwi")
                                )))

df$Fruits %in% df$Group

Ответы [ 2 ]

3 голосов
/ 13 апреля 2019

Поскольку Group - список, мы не можем его напрямую сравнить.Одним из способов является использование mapply

df$Present <- c("No", "Yes")[mapply(`%in%`, df$Fruits, df$Group) + 1]

df
#  Fruits        Group Present
#1  Apple Apple, S....     Yes
#2 Banana Orange, Kiwi      No
#3 Orange Apple, B....      No
#4   Kiwi  Apple, Kiwi     Yes

mapply, возвращающих TRUE / FALSE значений, а затем мы используем метод индексации для получения Yes / No.

mapply(`%in%`, df$Fruits, df$Group)
#[1]  TRUE FALSE FALSE  TRUE

или аналогично purrr map2_lgl

library(dplyr)
library(purrr)

df %>%
  mutate(Present = c("No", "Yes")[map2_lgl(Fruits, Group, `%in%`) + 1])
0 голосов
/ 13 апреля 2019

Мы можем использовать

library(data.table)
setDT(df)[, Present := unlist(Map(`%in%`, Fruits, Group))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...