#r #conditional-statements #distinct
#r #условные операторы #различные
Вопрос:
У меня есть фрейм данных, в котором я хочу сохранить все отдельные строковые записи (т. Е. Избавиться от дубликатов) в одном столбце, если только эти записи не короткие, str_length < 7 . Я также хочу сохранить все остальные столбцы.
Итак, у меня есть
строка | другие столбцы |
---|---|
«abc» | |
«abc» | |
«центавр» | |
«центавр» | |
«армагеддон» | |
«армагеддон» | |
«спагетти» |
Желаемый результат:
строка | другие столбцы |
---|---|
«abc» | |
«abc» | |
«центавр» | |
«армагеддон» | |
«спагетти» |
Я пробовал различные подходы dplyr, но ничего не работает.
df <- df %>%
mutate(len = str_length(string))%>%
group_by(string, len) %>%
filter(len >7) %>%
distinct(.keep_all = TRUE)
В этом примере я не получаю обратно строки, которые я отфильтровал. Но я просто хочу защитить отфильтрованные строки от функции distinct, а затем вернуть их обратно в dataframe.
Ответ №1:
Мы можем использовать duplicated
с nchar
df1[!(duplicated(df1$string) amp; nchar(df1$string) > 7), , drop = FALSE]
-вывод
# string
#1 abc
#2 abc
#3 centauri
#5 armageddon
#7 spaghetti
Или с filter
помощью dplyr
library(dplyr)
df1 %>%
filter(!(duplicated(string) amp; nchar(string) > 7))
данные
df1 <- structure(list(string = c("abc", "abc", "centauri", "centauri",
"armageddon", "armageddon", "spaghetti")), class = "data.frame",
row.names = c(NA,
-7L))
Комментарии:
1. Большое вам спасибо, это сработало! Я думал, что это должно быть очень просто, но я не мог этого понять. Единственное другое решение, которое пришло мне в голову сразу после публикации, состояло в том, чтобы ввести фиктивный столбец, в котором все строки с короткими строками получают случайно сгенерированное число / строку.
2. И дополнительное спасибо, что показали мне, как опубликовать здесь читаемый фрейм данных, я запомню это на будущее.