2016-08-15 3 views
2
Name Grade 
John C 
John C+ 
John C 
John B 
John A 
John A+ 
Kat B 
Kat C 
Kat B 

Я хочу добавить новый столбец Months, начиная с 3, а затем продолжить с его кратными. Строки отсортированы. Вывод будет выглядеть примерно такНумерация в R на основе значения столбца

Name Grade Months 
John C  3 
John C+ 6 
John C  9 
John B  12 
John A  15 
John A+ 18 
Kat B  3 
Kat C  6 
Kat B  9 

RCODE

name <- df$Name[1] 
count <- 0 
for (i in 1:length(df[,1])){ 
    if (name!=df$Name[i]){ 
     count <- 0 
     name <- df$Name[i] 
    } 
    df$Months[i] <- count 
    count <- count + 3 
} 

Могу ли я сделать это без цикла?

ответ

5

Попробуйте

library(dplyr) 
df1 %>% group_by(Name) %>% mutate(Months=3*seq(n())) 
3

Вы можете сделать накопленную сумму на векторе 3 сгруппированных по Name:

with(df, ave(rep(3, length(Name)), Name, FUN = cumsum)) 
# [1] 3 6 9 12 15 18 3 6 9 
1

Использование data.table, преобразовать 'data.frame' в «data.table '(setDT(df1)), сгруппированный по' Name ', присвойте (:=) продукт 3 с последовательностью строк в «Months».

library(data.table) 
setDT(df1)[, Months := 3* seq_len(.N) , by = Name] 
df1 
# Name Grade Months 
#1: John  C  3 
#2: John C+  6 
#3: John  C  9 
#4: John  B  12 
#5: John  A  15 
#6: John A+  18 
#7: Kat  B  3 
#8: Kat  C  6 
#9: Kat  B  9 
1

Другой вариант, очень похожий на ответ Psidom, используя seq с ave и 1:nrow(df) вместо df$Name, чтобы избежать вектора символов в качестве выходного сигнала.

ave(1:nrow(df), df$Name, FUN = seq)*3 
# [1] 3 6 9 12 15 18 3 6 9 
Смежные вопросы