2013-06-18 5 views
1

У меня есть кадр данных, который выглядит следующим образом:данные манипуляции кадров в R

id = c("A","B","C","A","C","C") 
val = c(5,4,6,7,10,99) 
df = data.frame(id, val) 
df 


id val 
A 5 
B 4 
C 6 
A 7 
C 10 
C 99 

Теперь я хотел бы вновь организовать id столбец (A, B, C ...), держать их соответствующими val, а затем добавить новый столбец newid, начинающийся с буквы E, за которым следуют три цифры, подсчитывающие число id в первом столбце. Код здесь:

id2 = c("A","A","B","C","C","C") 
val2 = c(5,7,4,6,10,99) 
newid = c("E001","E002","E001","E001","E002","E003") 
df2 = data.frame(id2, val2, newid) 
df2 

и конечный результат:

id2 val2 newid 
    A 5 E001 
    A 7 E002 
    B 4 E001 
    C 6 E001 
    C 10 E002 
    C 99 E003 

Есть ли эффективный способ сделать это?

ответ

3
library(data.table) 
dt = data.table(df) 

dt[, newid := paste0('E', gsub(' ', '0', format(1:.N, width = 3))), keyby = id] 
dt 
# id val newid 
#1: A 5 E001 
#2: A 7 E002 
#3: B 4 E001 
#4: C 6 E001 
#5: C 10 E002 
#6: C 99 E003 

keyby здесь делает сортировку, поэтому нет необходимости делать это явно

+0

спасибо! еще один вопрос: знаете ли вы, как я могу конкатенировать столбец newid с столбцом id? Я хочу получить столбец id sth как A: E001 A: E002 B: E001 C: E001 C: E002 C: E003. Еще раз спасибо! – alittleboy

+1

использовать 'paste0 (id, ': E', gsub ...)' – eddi

2

Вот один из способов сделать это, используя функцию order() организовать данные и функции sprintf(), sapply() и table() определить newid.

df2 <- df[order(df$id, df$val), ] 
df2$newid <- paste0("E", sprintf("%04d", unlist(sapply(table(df$id), function(x) 1:x)))) 
+0

спасибо! но метод data.table кажется более быстрым – alittleboy

Смежные вопросы