Условные отдельные строки в R

#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. И дополнительное спасибо, что показали мне, как опубликовать здесь читаемый фрейм данных, я запомню это на будущее.