2016-01-04 2 views
0

Я ретранслирую множество факторов, используя data.table в R. Это часто связано с большим количеством копирования и вставки. Мне интересно, могу ли я использовать раскрывающийся список типов в R, чтобы ускорить это. Так, например, когда вы вводите df$, он дает ниспадающий список, из которого можно выбрать. Вот пример:Быстрая перекодировка факторов в таблице данных

# Create example df 
Batch <- rep(LETTERS[seq(from=1, to =10)], each=1) 
Date <- rep(seq(as.Date("2001-01-01"), length.out = 5, by="1 day"), each=2) 
df <- data.table(Batch, Date) 

# Show factor combinations 
with(df, table(Date, Batch)) 

# Add new column based on factor labels. 
df[Date=="2001-01-01", NewBatch:="hello"] 
df[Date=="2001-01-02", NewBatch:="world"] 
#etc 

Как вы можете видеть, это может быть довольно продолжительным, если у меня есть десять факторов. Я думал, что-то вроде:

df$Date <- factor(df$Date) 
labs <- data.frame(unique(df$Date)) 
ndf <- matrix(, nrow=1, ncol=length(labs$unique.df.Date.)) 
ndf <- data.frame(ndf) 
colnames(ndf) <- c(labs[1],labs[2],labs[3],labs[4],labs[5]) 

Тогда я типа ndf$ и я выпадающий всех факторов. Однако это довольно грязно. Любые идеи, чтобы сделать его опрятным?

Благодарности

Update пытается предложения:

lookup <- data.table(Date = as.Date(unique(df[["Date"]])) , Newbatch = c("h","e","l","l","o")) 


df[lookup, Newbatch:=i.Newbatch, on="Date"] 

Вышеприведенные работает прекрасно.

+0

Создание просмотровых data.table и сделать объединение вместо вашего метода. – Roland

+0

Привет, Роланд. Разве это не связано с тем же копированием и вставкой, или я неловкий? Я отредактирую свой вопрос так, как вы думаете, пожалуйста, исправьте, если нет. – Pete900

ответ

2

Я не очень понимаю ваш вопрос, но я хотел бы сделать это:

lookup <- data.table(Date = as.Date(c("2001-01-01", "2001-01-02")), 
        #you could extract the preceding values using unique(df[["Date"]]) 
        NewBatch = c("hello", "world")) 
df[lookup, NewBatch := i.NewBatch, on = "Date"] 
# Batch  Date NewBatch 
# 1:  A 2001-01-01 hello 
# 2:  B 2001-01-01 hello 
# 3:  C 2001-01-02 world 
# 4:  D 2001-01-02 world 
# 5:  E 2001-01-03  NA 
# 6:  F 2001-01-03  NA 
# 7:  G 2001-01-04  NA 
# 8:  H 2001-01-04  NA 
# 9:  I 2001-01-05  NA 
#10:  J 2001-01-05  NA 
+0

Ах да, я вижу. Но тогда мне все еще приходится буквально печатать/копировать и проделывать даты в поиске. Извините за путаницу. Я пытался добраться до точки, где мне не нужно копировать дату. Я отредактирую свой вопрос, чтобы попытаться сделать его более ясным. – Pete900

+0

См. Комментарий внутри кода. Вам не нужно вводить даты. (Если у вас много дат, это становится опасным. С помощью справочной таблицы вы можете легко проверить, соответствуют ли даты и значениям 'newBatch' правильно.) – Roland

+0

О, я вижу. Я почему-то получаю неиспользуемую аргументную ошибку: Ошибка в '.data.table' (df, lookup,': = '(Newbatch, Newbatch), on =" Date "): неиспользуемый аргумент (on =" Date ") – Pete900

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