Проверьте, какие ячейки (которые содержат списки) содержат определенное значение? - PullRequest
0 голосов
/ 06 марта 2019

В R я хотел бы искать каждую ячейку в столбце, где столбец содержит серию списков. Я хотел бы вернуть индекс (или вернуть T / F) для ячеек, которые содержат определенное значение.

Например - я создал этот тестовый фрейм данных.

test <- data.frame(rows = 1:5, values = 0)
test$values <- list(1, c(2,3), c(4:6), 4, 0)

Попытка запросить его с помощью:

test[4 %in% test$values,] 

В этом примере я хотел бы вернуть ячейки, содержащие значение 4 (поэтому строки 3 и 4 должны быть истинными). Как мне это сделать? Мой текущий запрос возвращает только одно ИСТИНА, поскольку он просто проверяет весь столбец (не каждую ячейку в этом столбце).

В прошлом я решил эту проблему с помощью цикла for (примерно как ниже). например:

test$result <- FALSE
for (i in 1:nrow(test)){
    if (4 %in% test$values[i]){
        test$result[i] <- TRUE
    }
}

Я действительно не хочу, чтобы это было моим решением каждый раз, когда мне нужно сделать такой запрос.

Ответы [ 2 ]

1 голос
/ 06 марта 2019

Поскольку это список, вам нужно зациклить его, используя sapply / lapply

test$result <- sapply(test$values, function(x) 4 %in% x)

test
#  rows  values result
#1    1       1  FALSE
#2    2    2, 3  FALSE
#3    3 4, 5, 6   TRUE
#4    4       4   TRUE
#5    5       0  FALSE

Если вы хотите поместить эти строки в подмножества, вы можете сделать

test[sapply(test$values, function(x) 4 %in% x), ]

#  rows  values
#3    3 4, 5, 6
#4    4       4
0 голосов
/ 06 марта 2019

Функции map в пакете purrr хороши для работы с вложенными данными, такими как:

purrr::map_lgl(test$values, ~ 4 %in% .)
[1] FALSE FALSE  TRUE  TRUE FALSE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...