2016-08-11 2 views
0

У меня есть куча данных, которые я хочу внести в некоторые изменения в использование пакетов tidyr, reshape/reshape2.Реабилитация, плавление и отливка на больших кадрах данных в R

Y  C  S  A B_B_m B_B_p C_m C_p D_m D_p 
2000 "AUSTRIA" "total" "no" 33  44 55 66 77 99 
2001 "AUSTRIA" "total" "no" 22  11 0 23 24 25 
2002 "AUSTRIA" "total" "no" 88  45 56 47 38 39 
2003 "AUSTRIA" "total" "no" 90  48 67 67 69 74 

должны быть прийти

 "C" "Y" "S" "A"  "moment" "B_B" "C" "D" 
    "AUSTRIA" 2000 "total" "no"  "m"  33 55 77 
    "AUSTRIA" 2000 "total" "no"  "p"  44 66 99 
    "AUSTRIA" 2001 "total" "no"  "m"  22 0 24 
    "AUSTRIA" 2001 "total" "no"  "p"  11 23 25 
    "AUSTRIA" 2002 "total" "no"  "m"  88 56 38 
    "AUSTRIA" 2002 "total" "no"  "p"  45 47 39 
    "AUSTRIA" 2003 "total" "no"  "m"  90 67 69 
    "AUSTRIA" 2003 "total" "no"  "p"  48 67 74 

Я использую следующий код для достижения этой цели:

setwd("C:\\...) 
files = list.files(pattern="*.dta") #making a list for the files. 
dflist <- list() 
    for (i in 1:length(files)){         
     dflist[[i]] <- read.dta13(files[i], nonint.factors = TRUE) 
     dflist[[i]] <- melt(dflist[[i]], id=c("C","Y","S","A")) 
     dflist[[i]] <- extract(dflist[[i]], variable, c('type', 'moment'), '^(.+)_([^_]+)$') 
     dflist[[i]] <- cast(dflist[[i]],...~type) 
    } 

Теперь этот код работает, но не для больших dataframes. Некоторые из моих данных имеют сотни, если не тысячи переменных, и с использованием этого кода у меня заканчивается память или R просто сбой. Есть идеи?

Edit:

Кто-то заметил что-то о пакете Ф.Ф., но удалил свой комментарий. Во всяком случае, я посмотрел в этот пакет немного, но я даже не могу показаться, чтобы иметь возможность читать dataframe в R ...

Я пробовал: ffdfbig <- read.csv.ffdf(file="dfbig.csv") Но это дало мне ошибку:

`Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec, : 
    scan() expected 'an integer', got '"1001"'` 

Я также попытался использовать colClasses аргумент:

sampleData <- read.csv("dfbig.csv", header = TRUE, nrows = 5) 
    > classes <- sapply(sampleData, class) 
    > ffdfbig <- read.csv.ffdf(file="dfbig.csv",header = TRUE, colClasses=classes) 

И получил тот же тип ошибки:

Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec, : 
    scan() expected 'an integer', got '"1"' 

:(

+0

И что мне делать ??? :( – Floris

ответ

1

Если ваш набор данных больше, вы можете попробовать с пакетом ff. Here вы можете найти несколько примеров того, как его использовать.

Другой вариант заключается в использовании пакета data.table, here, вы можете найти основной учебник.

EDITED

Хорошо, вот то, что я до сих пор. Если предположить, что у вас есть .csv файл с данными выборки вы предоставили:

Y,C,S,A,B_B_m,B_B_p,C_m,C_p,D_m,D_p 
2000,"AUSTRIA","total","no",33,44,55,66,77,99 
2001,"AUSTRIA","total","no",22,11,0,23,24,25 
2002,"AUSTRIA","total","no",88,45,56,47,38,39 
2003,"AUSTRIA","total","no",90,48,67,67,69,74 

Вы можете прочитать файл, используя пакет Ф.Ф. с этим:

library(ff) 
library(ffbase) 
library(reshape2) 

ffdfbig <- read.csv.ffdf(file="/path/to/your/file/dataFile.csv", 
         colClasses=c("numeric", rep("factor", 3), rep("numeric", 6)), 
         header = T) 

Вы сказали, что у вас возникли проблемы с чтением целых чисел (когда они были выведены из .csv), я смог прочитать файл и сгенерировать объект ffdf, явно передав классы столбцов. После того как вы ffdf объекта, вы можете создать первую часть вашего переформирования rocess с помощью этого:

res <- ffdfdply(x=ffdfbig, split=ffdfbig$Y, FUN=function(x){ 
    df <- reshape(x, 
       v.names = "value", 
       varying = c("B_B_m", "B_B_p", "C_m", "C_p", "D_m", "D_p"), 
       timevar = "variable", 
       times = c("B_B_m", "B_B_p", "C_m", "C_p", "D_m", "D_p"), 
       direction = "long") 
    as.data.frame(df) 
}) 

Я не имел ни малейшего представления о том, как применить функцию к ffdf пакету, но this ответ дал мне ключ.

В результате приведенного выше кода будет таким:

"Y","C","S","A","variable","value","id" 
2000,"AUSTRIA","total","no","B_B_m",33,1 
2001,"AUSTRIA","total","no","B_B_m",22,2 
2002,"AUSTRIA","total","no","B_B_m",88,3 
2003,"AUSTRIA","total","no","B_B_m",90,4 
2000,"AUSTRIA","total","no","B_B_p",44,1 
2001,"AUSTRIA","total","no","B_B_p",11,2 
2002,"AUSTRIA","total","no","B_B_p",45,3 
2003,"AUSTRIA","total","no","B_B_p",48,4 

Наконец, «разделение» процесс «М» с и «р» с и отливки в широком формате:

res <- ffdfdply(x=res, split = res$Y, FUN = function(y){ 
    vars <- c("prefix", "moment") 
    df <- extract(y, variable, c('type', 'moment'), '^(.+)_([^_]+)$') 
}) 

res <- ffdfdply(x = res, split = res$Y, FUN = function(x){ 
    df <- dcast(x, ...~type) 
}) 

res$id <- NULL 

в случае, если вы хотите написать его снова в формате CSV, вы можете использовать эту функцию:

write.csv.ffdf(res, "final.csv") 

Какой бы производить followi нг csv

"","Y","C","S","A","moment","B_B","C.1","D" 
"1",2000,"AUSTRIA","total","no","m",33,55,77 
"2",2000,"AUSTRIA","total","no","p",44,66,99 
"3",2001,"AUSTRIA","total","no","m",22,0,24 
"4",2001,"AUSTRIA","total","no","p",11,23,25 
"5",2002,"AUSTRIA","total","no","m",88,56,38 
"6",2002,"AUSTRIA","total","no","p",45,47,39 
"7",2003,"AUSTRIA","total","no","m",90,67,69 
"8",2003,"AUSTRIA","total","no","p",48,67,74 

Вы можете попробовать эти функции со всеми вашей большой csv, чтобы увидеть, если это вызывает исключения памяти. Надеюсь, это поможет.

+3

Вы можете принести часть информации в ссылках в сообщение здесь. 4 ссылки без какой-либо другой информации - это не очень сильный ответ. –

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