Создайте новую переменную, равную текстовой переменной минимальному количеству символов в группе. - PullRequest
0 голосов
/ 03 июля 2018

У меня есть фрейм данных с переменной фактора и идентификатор, который помогает сгруппировать эти факторы. Вот мой пример фрейма данных и сопровождающего кода, который в настоящее время не дает правильный ответ:

library(dplyr)
names <- c("Andrew","Andrew","Andy","Andy","Alex","Alexander")
name.id <- c(1,1,1,1,2,2)
df1 <- data.frame(names, name.id)

df1 <-  group_by(df1,name.id) %>%
        mutate(name.len=nchar(as.character(names)))  %>%
        mutate(new.name = min(as.character(names)))

Я хочу, чтобы переменная new.name равнялась имени в группе идентификаторов с наименьшим количеством символов (name.len). Переменная должна быть «Alex» для ID = 1, но при использовании минимальной переменной сравниваются только символы внутри каждой цифры, в результате чего значение «r» в «Andrew» будет меньше значения «y» в «Andy». Я не знаю, как сделать условную переменную, которая получает этот фактор, связанный с минимальным значением nchar в группах

EDIT: Чтобы быть более понятным, я хотел бы, чтобы мои окончательные данные выглядели следующим образом (вспомогательные столбцы тоже подойдут):

      names name.id new.names
1    Andrew       1      Andy
2    Andrew       1      Andy
3      Andy       1      Andy
4      Andy       1      Andy
5      Alex       2      Alex
6 Alexander       2      Alex

1 Ответ

0 голосов
/ 03 июля 2018

Вы можете группировать по name.id, а затем sort по количеству символов в names. Наконец, выберите самый верхний ряд для каждой группы.

Решение с использованием dplyr может быть следующим:

library(dplyr)

df1 %>% group_by(name.id) %>%
  mutate(newname = first(names, order_by = nchar(as.character(names)))) %>%
  as.data.frame()

#       names name.id newname
# 1    Andrew       1    Andy
# 2    Andrew       1    Andy
# 3      Andy       1    Andy
# 4      Andy       1    Andy
# 5      Alex       2    Alex
# 6 Alexander       2    Alex
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...