2016-03-16 3 views
0

Я хочу дать числа для каждой группы в dataframe. Например, у меня есть следующий dataframe:Как указать числа для каждой группы данных с dplyr :: group_by?

df = data.frame(from = c('a', 'a', 'b'), dest = c('b', 'c', 'd')) 
#> df 
    #from dest 
#1 a b 
#2 a c 
#3 b d 

Я хочу, чтобы сгруппировать по from значениям и дают номер группы для каждой группы. Это ожидаемый результат:

result = data.frame(from = c('a', 'a', 'b'), dest = c('b', 'c', 'd'), group_no = c(1,1,2)) 
#> result 
    #from dest group_no 
#1 a b  1 
#2 a c  1 
#3 b d  2 

я могу решить эту проблему, используя для цикла следующим образом:

groups = df$from %>% unique 
i = 0 
df$group_no = NA 
for (g in groups) { 
    i = i + 1 
    df[ df$from == g, ]$group_no = i 
} 
#> df 
    #from dest group_no 
#1 a b  1 
#2 a c  1 
#3 b d  2 

Интересно, если это возможно, чтобы решить эту проблему в более элегантный и функциональный способ без использование для циклов? В частности, мне интересно, можно ли это сделать с помощью функции dplyr::group_by?

ответ

4

Используйте mutate, чтобы добавить столбец, который представляет собой только цифровую форму from в качестве фактора:

df %>% mutate(group_no = as.integer(factor(from))) 

# from dest group_no 
# 1 a b  1 
# 2 a c  1 
# 3 b d  2 

... или просто

mutate(df, group_no = as.integer(factor(from))) 

Примечание group_by Здесь нет необходимости, если вы не используете его для других целей. Если вы хотите группировать новый столбец для использования позже, вы можете использовать group_by вместо mutate, чтобы добавить столбец.

+1

Нет необходимости использовать group_by вообще. df%>% mutate (group_no = as.integer (from)) OP движется в неправильном направлении. –

+0

Редактирование, чтобы упомянуть, что, как вы прокомментировали ... – alistaire

+0

@ Грегор Это похоже на консенсус. Я отредактирую и упрощу. – alistaire

1

Вы можете попробовать transform из базового пакета

transform(df,group_no=as.numeric(factor(from))) 

# from dest group_no 
#1 a b 1 
#2 a c 1 
#3 b d 2 

Если from столбец уже фактор, который вы можете удалить функцию factor() и использовать только

transform(df,id=as.numeric(from)) 
3

Мы можем использовать group_indices из dplyr

library(dplyr) 
df %>% 
    mutate(group_no = group_indices_(., .dots="from")) 
#  from dest group_no 
#1 a b  1 
#2 a c  1 
#3 b d  2 

Аналогичный вариант с использованием data.table не

library(data.table) 
setDT(df)[, group_no := .GRP, by = from] 
Смежные вопросы