Как фильтровать значения в списке внутри фрейма данных в R?

#r

#r

Вопрос:

У меня есть фрейм данных, df :

 df <- structure(list(id = c("id1", "id2", "id3", 
"id4"), type = c("blue", "blue", "brown", "blue"
), value = list(
    value1 = "cat", value2 = character(0), 
    value3 = "dog", value4 = "fish")), row.names = 1:4, class = "data.frame")

> df
   id  type value
1 id1  blue   cat
2 id2  blue      
3 id3 brown   dog
4 id4  blue  fish
 

Третий столбец, value , представляет собой список. Я хочу иметь возможность отфильтровывать любые строки в фрейме данных, где записи в этом столбце не содержат никаких символов (т.Е. вторая строка).

Я пробовал это:

 df <- filter(df, value != "")
 

и это

 df <- filter(df, nchar(value) != 0)
 

Но это никак не влияет на фрейм данных. Как правильно это сделать, чтобы мой фрейм данных выглядел следующим образом:

 > df
   id  type value
1 id1  blue   cat
3 id3 brown   dog
4 id4  blue  fish
 

Ответ №1:

lengths() Функция здесь идеальна — она дает длину каждого элемента списка. Вы хотите, чтобы все строки, где value имеет ненулевую длину:

 df[lengths(df$value) > 0, ]
#    id  type value
# 1 id1  blue   cat
# 3 id3 brown   dog
# 4 id4  blue  fish
 

Ответ №2:

вот мой подход

 idx <- lapply(df$value, length)
filter(df, idx > 0)

  id  type value
1 id1  blue   cat
2 id3 brown   dog
3 id4  blue  fish
 

Ответ №3:

Опция с tidyverse

 library(dplyr)
library(purrr)
df %>%
     filter(map_int(value, length) > 0)
#   id  type value
#1 id1  blue   cat
#2 id3 brown   dog
#3 id4  blue  fish
 

Ответ №4:

Попробуйте это:

 df <- filter(df, !sapply(df$value,function(x) identical(x,character(0))) )