#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))) )