2016-12-08 2 views
1

У меня есть более 10000 файлов. Сначала я установил каталог в папку, в которой находятся файлы.как я могу манипулировать очень большим списком

Тогда я сделать ссылку на все файлы с .txt формате, как этот

filenames <- list.files("path to the file", pattern="*.txt", full.names=TRUE) 

Затем я прочитал его с fread

ldf<- lapply(filenames, FUN=fread, header=TRUE) 

Почему Fread? на самом деле, когда я использую data.table, он испортится, например, тогда я должен добавить sep"," и row.names=FALSE и т. д. Если вы знаете лучший способ, проконсультируйтесь, пожалуйста. В любом случае

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

Конечно, в реальных данных, есть способ гораздо больше столбцов в каждом файле, есть только три имени check и myfile и Myname

Теперь я пытался сохранить только колонка myfile и Myname следующей командой, которая этого не сделала.

t<- lapply(ldf, `[`, c(2,3)) 



my.list <- list(structure(list(check = c(FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE), myfile = c("", "1xLabel:13C(6)15N(4) [R11]", "1xOxidation [M7]", 
"", "1xLabel:13C(6)15N(4) [R11]", ""), myname = c("Q9Y383", "Q9Y383", 
"Q9Y383", "Q15366-2", "Q15366-2", "Q15366-2")), .Names = c("check", 
"myfile", "myname"), row.names = c(NA, -6L), class = c("data.table", 
"data.frame")), structure(list(
    check = c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE 
    ), myfile = c(NA, NA, NA, NA, NA, NA, NA), Myname = c("F8W727", 
    "O76021", "P46783", "P35527", "Q96C45", "Q9Y383", "Q9Y383" 
    )), .Names = c("check", "myfile", "myname"), row.names = c(NA, 
-7L), class = c("data.table", "data.frame")), 
    structure(list(check = c(FALSE, FALSE, FALSE, FALSE, FALSE, 
    FALSE, FALSE, FALSE, FALSE, FALSE, FALSE), myfile = c("", 
    "2xLabel:13C(6)15N(4) [R6; R8]; 1xCarbamidomethyl [C4]", 
    "", "", "", "1xCarbamidomethyl [C1]", "", "", "", "", "1xLabel:13C(6)15N(4) [R6]; 1xCarbamidomethyl [C5]" 
    ), myname = c("P39019", "A2A3R5; P62753", "Q8IYB3; E9PCT1; M0R088; A9Z1X7; Q8IYB3-2", 
    "S4R3J4; O43390-3; B4DT28; O43390; O43390-2; O60506; O60506-2; E7ETM7", 
    "P07910-4; B4DY08; G3V4C1; P07910-2; G3V4W0; P07910; G3V5V7; P07910-3; G3V2D6; G3V2Q1", 
    "D6R9X9; D6RG19; P61927", "Q00839", "G3XAD8; H0YGI8; P31948; F5H0T1", 
    "Q8IYB3; E9PCT1; M0R088; A9Z1X7; Q8IYB3-2", "P42766", "Q9NX58; D6RDJ1" 
    )), .Names = c("check", "myfile", "myname"), row.names = c(NA, 
    -11L), class = c("data.table", "data.frame")), 
    structure(list(check = c(FALSE, FALSE, FALSE, FALSE, FALSE, 
    FALSE, FALSE, FALSE, FALSE, FALSE, FALSE), myfile = c("", 
    "", "", "", "1xLabel:13C(6)15N(4) [R7]", "", "", "", "3xLabel:13C(6)15N(4) [R1; R7; R10]", 
    "", ""), myname = c("P61247", "P39019", "Q9NWH9", "P62917", 
    "P62917", "E9PCT1", "Q15149", "Q14152", "Q14152", "Q15020", 
    "Q02543")), .Names = c("check", "myfile", "myname"), row.names = c(NA, 
    -11L), class = c("data.table", "data.frame"))) 

Что я хочу?

Я хочу проверить, есть ли у меня myfile и myname во всех загруженных файлах? и затем имеют такой выход

file1    file2     file3     file4 
myfile myname  myfile myname  myfile myname  myfile myname 
info  info   info  info  info info  info  info 

Чтобы сделать его более воспроизводимым. Я хочу, чтобы выходной пример данных, чтобы быть как ниже

myout<- structure(list(myfile1 = structure(c(NA, 1L, 2L, NA, 1L, NA, 
NA, NA, NA, NA, NA), .Label = c("1xLabel:13C(6)15N(4) [R11]", 
"1xOxidation [M7]"), class = "factor"), Myname1 = structure(c(2L, 
2L, 2L, 1L, 1L, 1L, NA, NA, NA, NA, NA), .Label = c("Q15366-2", 
"Q9Y383"), class = "factor"), myfile2 = c(NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA), Myname2 = structure(c(1L, 2L, 4L, 3L, 
5L, 6L, 6L, NA, NA, NA, NA), .Label = c("F8W727", "O76021", "P35527", 
"P46783", "Q96C45", "Q9Y383"), class = "factor"), myfile3 = structure(c(NA, 
3L, NA, NA, NA, 1L, NA, NA, NA, NA, 2L), .Label = c("1xCarbamidomethyl [C1]", 
"1xLabel:13C(6)15N(4) [R6]; 1xCarbamidomethyl [C5]", "2xLabel:13C(6)15N(4) [R6; R8]; 1xCarbamidomethyl [C4]" 
), class = "factor"), Myname3 = structure(c(5L, 1L, 8L, 10L, 
4L, 2L, 7L, 3L, 8L, 6L, 9L), .Label = c("A2A3R5; P62753", "D6R9X9; D6RG19; P61927", 
"G3XAD8; H0YGI8; P31948; F5H0T1", "P07910-4; B4DY08; G3V4C1; P07910-2; G3V4W0; P07910; G3V5V7; P07910-3; G3V2D6; G3V2Q1", 
"P39019", "P42766", "Q00839", "Q8IYB3; E9PCT1; M0R088; A9Z1X7; Q8IYB3-2", 
"Q9NX58; D6RDJ1", "S4R3J4; O43390-3; B4DT28; O43390; O43390-2; O60506; O60506-2; E7ETM7" 
), class = "factor"), myfile4 = structure(c(NA, NA, NA, NA, 1L, 
NA, NA, NA, 2L, NA, NA), .Label = c("1xLabel:13C(6)15N(4) [R7]", 
"3xLabel:13C(6)15N(4) [R1; R7; R10]"), class = "factor"), Myname4 = structure(c(3L, 
2L, 9L, 4L, 4L, 1L, 8L, 6L, 6L, 7L, 5L), .Label = c("E9PCT1", 
"P39019", "P61247", "P62917", "Q02543", "Q14152", "Q15020", "Q15149", 
"Q9NWH9"), class = "factor")), .Names = c("myfile1", "Myname1", 
"myfile2", "Myname2", "myfile3", "Myname3", "myfile4", "Myname4" 
), class = "data.frame", row.names = c(NA, -11L)) 
нового запроса

Тогда я хочу, чтобы разделить данные на два dataframe. Один держит только тот mynames, что их MyFile имеет специальные строки, называемые df1 и один тот mynames, что их MyFiles не имеет ничего или не те специальные строки

df1<- structure(list(myname1 = structure(c(3L, 2L, 1L, 1L), .Label = c("", 
"Q15366-2", "Q9Y383"), class = "factor"), myname2 = c(NA, NA, 
NA, NA), myname3 = structure(c(1L, 3L, 4L, 2L), .Label = c("A2A3R5", 
"D6RDJ1", "P62753", "Q9NX58"), class = "factor"), myname4 = structure(c(2L, 
3L, 1L, 1L), .Label = c("", "P62917", "Q14152"), class = "factor")), .Names = c("myname1", 
"myname2", "myname3", "myname4"), class = "data.frame", row.names = c(NA, 
-4L)) 


df2 <- structure(list(myname1 = structure(c(3L, 3L, 2L, 2L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L), .Label = c("", "Q15366-2", "Q9Y383"), class = "factor"), 
    myname2 = structure(c(2L, 3L, 5L, 4L, 6L, 7L, 7L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L), .Label = c("", "F8W727", "O76021", "P35527", "P46783", 
    "Q96C45", "Q9Y383"), class = "factor"), myname3 = structure(c(29L, 
    33L, 11L, 18L, 1L, 34L, 35L, 22L, 6L, 20L, 21L, 23L, 4L, 
    10L, 27L, 7L, 2L, 25L, 15L, 24L, 16L, 26L, 13L, 14L, 8L, 
    9L, 31L, 8L, 9L, 31L, 32L, 17L, 3L, 28L, 12L, 33L, 11L, 19L, 
    5L, 34L, 30L), .Label = c(" A9Z1X7", " G3V4C1", " H0YGI8", 
    " O60506-2 ", "A9Z1X7", "B4DT28", "B4DY08", "D6R9X9", "D6RG19", 
    "E7ETM7", "E9PCT1", "F5H0T1", "G3V2D6", "G3V2Q1", "G3V4W0", 
    "G3V5V7", "G3XAD8", "M0R088", "M0R088 ", "O43390", "O43390-2", 
    "O43390-3", "O60506", "P07910", "P07910-2 ", "P07910-3 ", 
    "P07910-4", "P31948", "P39019", "P42766", "P61927", "Q00839", 
    "Q8IYB3", "Q8IYB3-2", "S4R3J4"), class = "factor"), myname4 = structure(c(4L, 
    3L, 10L, 5L, 2L, 9L, 7L, 8L, 6L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("", 
    "E9PCT1", "P39019", "P61247", "P62917", "Q02543", "Q14152", 
    "Q15020", "Q15149", "Q9NWH9"), class = "factor")), .Names = c("myname1", 
"myname2", "myname3", "myname4"), class = "data.frame", row.names = c(NA, 
-41L)) 
+0

'my.list' выдает ошибку. – Sotos

+0

'Ошибка: неожиданно '<' in: " c (NA, -11L), clas "' – Sotos

+0

@akrun, почему вы снова удалили свой ответ !!!! – nik

ответ

2

Вот подход. Вы можете изменить имена столбцов после и сделать другие дополнительные косметические изменения, которые вам нравятся. Это предназначено, чтобы разобраться в сути вашей проблемы, вы можете нарядить ее, как вам нравится. Я написал вспомогательную функцию add_rows, которая принимает три аргумента; кадр данных, количество добавляемых строк и заполнение их.

library(data.table) 
#version 1.10+ 

#Helper function to add extra rows 
add_rows <- function(DT, n, fill='') { 
    rbindlist(list(DT, data.table(myfile=rep(fill,n), Myname=rep(fill,n)))) 
} 

#Remove first column 
lst2 <- lapply(my.list, function(x) x[, c("myfile", "myname")]) #if using version <= 1.9.8, x[, -1, with=FALSE] 

#data table with most rows 
len <- max(sapply(lst2, nrow)) 

#Add rows 
lst3 <- lapply(lst2, function(x) add_rows(x, len-nrow(x))) 

#Order rows 
#braces have backslashes added because without them those characters have special meaning in searches 
tofind <- c("13C\\(6\\)15N\\(4\\)", "13C\\(6\\)") 
lst4 <- lapply(lst3, function(DT) { 
    pattern <- paste0(tofind, collapse="|") 
    moveup <- DT[, grep(pattern, myfile)] 
    myorder <- c(moveup, setdiff(1:nrow(DT), moveup)) 
    DT[myorder] 
}) 

#Combine data 
newdf <- do.call('cbind', lst4) 

#Update names 
setnames(newdf, paste0(names(newdf), rep(1:table(names(newdf))[1], each=2))) 

newdf 
+0

Ничего, я не знал, что индексирование с '-1' работает, поэтому я пытаюсь« bind_cols() »и делать что-то вроде' new_df [c (F, T, T)] '... – Sotos

+0

Я отредактирую это. Я просто вспомнил, что вы перешли на 'data.frame' для примера из-за проблемы с публикацией. Фактически вы работаете с таблицами данных. –

+0

Является ли ошибка с примером? –

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