2013-09-18 2 views
2

Цель состоит в том, чтобы объединить первые 6 столбцов из нескольких файлов в кадр данных в R. Я озадачен тем, почему метод (1) работает, но метод (2) не работает. Для меня оба метода должны быть эквивалентными.В R, как подмножество данных в sapply?

Ответы или подсказки для отладки очень приветствуются.

Метод (1)

ret <- sapply(fn, function(x) { (read.table(x, header = FALSE)) }) 
ret <- lapply(ret, function(x) {x[, 1:6]}) 

Метод (1) правильные выходы:

 
> head(ret) 
$`../pool.11421.poolFile` 
    V1 V2  V3 V4 V5    V6 
1 1 M5132 ACAGTG 11421 351 1,2,3,4,5,6,7,8 
2 2 M6764 ACTGAT 11421 351 1,2,3,4,5,6,7,8 
3 3 M5597 AGTCAA 11421 351 1,2,3,4,5,6,7,8 
4 4 M5636 AGTTCC 11421 351 1,2,3,4,5,6,7,8 
5 5 M2463 ATCACG 11421 351 1,2,3,4,5,6,7,8 
6 6 M5792 ATGTCA 11421 351 1,2,3,4,5,6,7,8 
7 7 M6799 ATTCCT 11421 351 1,2,3,4,5,6,7,8 

Метод (2)

ret <- sapply(fn, function(x) { (read.table(x, header = FALSE))[, 1:6]}) 

Метод (2) неправильные выходы :

 
> head(ret) 
     ../pool.11421.poolFile ../pool.11422.poolFile ../pool.11423.poolFile 
V1 Integer,23    Integer,48    Integer,48 
V2 Character,23   Character,48   Character,48 
V3 Character,23   Character,48   Character,48 
V4 Integer,23    Integer,48    Integer,48 
V5 Integer,23    Integer,48    Integer,48 
V6 Character,23   Character,48   Character,48 
+1

Что происходит, когда вы добавляете упрощать = FALSE в sapply в (2)? – mengeln

ответ

3

Ваш второй метод возвращает массив. sapply имеет аргумент simplify. Если вызывается TRUEsimplify2array и R пытается преобразовать ваши данные в вектор или массив. См. ?sapply.

Попробуйте вместо этого:

ret <- sapply(fn, function(x) { (read.table(x, header = FALSE))[, 1:6]}, simplify=FALSE) 
+3

Следствием, вероятно, является то, что 'sapply' почти наверняка является неправильным инструментом здесь. Я хотел бы также указать, что в методе 1 каждый считываемый кадр данных может иметь различное количество столбцов и, следовательно, иметь разную длину, поэтому 'sapply' даже не пытается их упростить, что позволяет использовать второй' lapply' призвать к работе по назначению. Во втором методе принудительное одинаковое количество столбцов каждый раз заставляет попытку упрощения. – joran

+0

Спасибо за ответы от вас обоих. Я изучил упрощенный вариант в 'sapply' и когда он будет работать. @joran, вы упомянули здесь, я не должен использовать 'sapply'. Какой инструмент вы предлагаете? – zhanxw

+1

@zhanxw Я имел в виду только то, что 'sapply' является просто оболочкой для' lapply', что делает некоторые удобные упрощения. Если вы не хотите/нуждаетесь в этих упрощениях, вероятно, имеет смысл просто использовать 'lapply' и сшить их все через нечто вроде' do.call (rbind, ...) '. – joran

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