Предположим, у вас есть фрейм данных со следующей структурой:
df <- data.frame(a=c(1,2,3,4), b=c("job1;job2", "job1a", "job4;job5;job6", "job9;job10;job11"))
, где столбец b
представляет собой список, разделенный точкой с запятой (несбалансированный по строке).Идеальный data.frame:
id,job,jobNum
1,job1,1
1,job2,2
...
3,job6,3
4,job9,1
4,job10,2
4,job11,3
У меня есть частичное решение, которое занимает почти 2 часа (170K строк):
# Split the column by the semicolon. Results in a list.
df$allJobs <- strsplit(df$b, ";", fixed=TRUE)
# Function to reshape column that is a list as a data.frame
simpleStack <- function(data){
start <- as.data.frame.list(data)
names(start) <-c("id", "job")
return(start)
}
# pylr!
system.time(df2 <- ddply(df, .(id), simpleStack))
Кажется, это проблема размера, потому чтоесли я запускаю
system.time(df2 <- ddply(df[1:4000,c("id", "allJobs")], .(id), simpleStack))
, это займет всего 9 секунд.Первое преобразование в набор data.frames с помощью sapply (с другой функцией) происходит быстро, но требуемый rbind занимает еще больше времени.