2016-10-22 11 views
1

так что мой вопрос может быть очень простым. Я благодарю любую помощь:R: символы превратились в NA после rbind'ing с пустым символьным фреймом данных

Я пытаюсь разобрать вложенный список в кадр данных с использованием циклов. Чтобы сделать это, я первый создал пустой кадр данных, с именами столбцов и все столбцы как символы:

dat<-data.frame(a=character(0), b=character(0), c=character(0), d=character(0), e=character(0), f=character(0),stringsAsFactors=FALSE) 

Сейчас ул (Дат) вернуться бы что-то вроде этого:

'data.frame': 0 obs. of 6 variables: 

$ a: chr 
$ b : chr 
$ c: chr 
$ d: chr 
$ e: chr 
$ f: chr 

Затем с помощью для циклов я смог извлечь список переменных из вложенного списка. Есть несколько вложенных циклов, посвященных несколько вложенных фреймов данных, так вот упрощенный вариант:

for(i in 1:3){ 
    a<-"sdfsaf" 
    b<-"dfadasfsd" 
    c<-"fdsfsadf" 
    d<-"dfads" 
    e<-"sfdsfdsf" 
    f<-"dfsfsdf" 
    dat<-rbind(dat,setNames(as.list(c(a,b,c,d,e,f)),names(dat)))  
} 

После первого цикла (я == 1), возвращаемый Дат будет выглядеть следующим образом:

 a   b   c   d   e   f 
2 sdfsaf  dfadasfsd fdsfsadf  dfads  sfdsfdsf  dfsfsdf 

Все выглядит хорошо. Однако, после того, как все три петли завершено, что я получил, как это:

a   b   c   d   e   f 
2 sdfsaf  dfadasfsd fdsfsadf  dfads  sfdsfdsf  dfsfsdf 
3 <NA>  <NA>  <NA>    <NA>  <NA>   <NA> 
4 <NA>  <NA>  <NA>    <NA>  <NA>   <NA> 

Теперь я проверил ул (Дат). Столбцы в кадре данных меняются на факторы! Он показывает что-то вроде этого: 'data.frame': 3 obs. 6 переменных:

$ a: Factor w/ 1 level "sdfsaf": 1 NA NA 
$ b : Factor w/ 1 level "dfadasfsd": 1 NA NA 
$ c: Factor w/ 1 level "fdsfsadf": 1 NA NA 
$ d: Factor w/ 1 level "dfads": 1 NA NA 
$ e: Factor w/ 1 level "sfdsfdsf": 1 NA NA 
$ f: Factor w/ 1 level "dfsfsdf": 1 NA NA 

Я использовал источник для отладки и удостоверились, что каждая переменная в каждом цикле не было NA или NULL. Я также использовал класс(), чтобы убедиться, что каждая переменная является типом символа. Как вектор символов в сочетании с кадром данных типа символа изменит все на факторы?

Пожалуйста, помогите. Спасибо.

+1

'data.frame' преобразует символы в факторы, если у вас нет' strAsAsFactors = FALSE'; Я предполагаю, что он вызван, когда вы переверните список в data.frame. Однако создание кадра данных с циклом 'for' действительно нецелесообразно; что вы на самом деле пытаетесь достичь? – alistaire

+0

Спасибо! Я знаю, что я, вероятно, должен был использовать tapply, lapply или apply, но цикл 'for' просто проще обернуть голову вокруг этого вложенного файла list/json. В основном, данные, которые я хочу получить, из 16 столбцов данных, причем один из столбцов является вложенным списком с тремя уровнями. Кроме того, количество элементов этого списка зависит от каждой строки данных. Но теперь, используя метод @Arun kumar mahesh, я решил эту проблему. Мне нужно вернуться позже, чтобы найти более эффективный способ сделать это. Но на данный момент у меня не хватает времени. Благодарю. – Rui

+0

На самом деле, ваш совет был прав: «Создание data.frame с циклом for действительно нецелесообразно». Первоначальный подход 'dat [, 1: 6] <-apply (dat [, 1: 6], 2, as.character) работал. Затем я получил это сообщение об ошибке: «Ошибка в if (d2 == 0L) {: отсутствует значение, где TRUE/FALSE необходимо» после нескольких циклов. Я предполагаю, что функция 'apply' вызывает' if'?В противном случае, почему эта ошибка появится сразу после 'dat [, 1: 6] <-apply (dat [, 1: 6], 2, as.character)?? Пожалуйста помоги. – Rui

ответ

1
for(i in 1:3){ 
    dat<-rbind(dat,setNames(as.list(c(a,b,c,d,e,f)),names(dat))) 

} 

dat[,1:6] <-apply(dat[,1:6],2, as.character) 

str(dat) 
'data.frame': 3 obs. of 6 variables: 
    $ a: chr "sdfsaf" "sdfsaf" "sdfsaf" 
$ b: chr "dfadasfsd" "dfadasfsd" "dfadasfsd" 
$ c: chr "fdsfsadf" "fdsfsadf" "fdsfsadf" 
$ d: chr "dfads" "dfads" "dfads" 
$ e: chr "sfdsfdsf" "sfdsfdsf" "sfdsfdsf" 
$ f: chr "dfsfsdf" "dfsfsdf" "dfsfsdf" 
+0

Большое спасибо. Я пробовал этот метод и работал как шарм! Теперь у меня есть все мои векторы символов, добавленные в пустой фрейм данных! – Rui

+0

@ Rui, пожалуйста, проголосуйте, если вы чувствуете, что ответ правильный –

0

Заменить rbind линию:

dat <- rbind(dat, setNames(as.list(c(a,b,c,d,e,f)), names(dat)), stringsAsFactors = FALSE) 

Вот полный скрипт без выхода:

> dat<-data.frame(a=character(0), b=character(0), c=character(0), d=character(0), e=character(0), f=character(0),stringsAsFactors=FALSE) 
> for(i in 1:3){ 
+ a<-"sdfsaf" 
+ b<-"dfadasfsd" 
+ c<-"fdsfsadf" 
+ d<-"dfads" 
+ e<-"sfdsfdsf" 
+ f<-"dfsfsdf" 
+ dat<-rbind(dat,setNames(as.list(c(a,b,c,d,e,f)),names(dat)),stringsAsFactors = FALSE)  
+ } 
> dat 
     a   b  c  d  e  f 
1 sdfsaf dfadasfsd fdsfsadf dfads sfdsfdsf dfsfsdf 
2 sdfsaf dfadasfsd fdsfsadf dfads sfdsfdsf dfsfsdf 
3 sdfsaf dfadasfsd fdsfsadf dfads sfdsfdsf dfsfsdf 

Я получил этот ответ как под R 3.3.1 и разрабатываемую версию R.

+0

Спасибо. Я просто попытался это, но есть что-то вроде этого: – Rui

+0

POST_ID тип автора предмет содержания при 2 post_id тип автора предметное содержание, когда stringsAsFactors FALSE FALSE FALSE FALSE FALSE FALSE stringsAsFactors1 FALSE FALSE FALSE FALSE FALSE FALSE Rui

+0

Я показал полный сценарий с выходом и, как вы можете видеть это дает ожидаемый ответ. –