2016-08-15 87 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

你可以通過Name分組的3載體的累計總和:

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)),按'姓名'分組,將(3)的乘積分配(:=)到'月'的行序列中。

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的回答,使用與seqave,並1:nrow(df)代替df$Name避免字符向量作爲輸出。

ave(1:nrow(df), df$Name, FUN = seq)*3 
# [1] 3 6 9 12 15 18 3 6 9