так что мой вопрос может быть очень простым. Я благодарю любую помощь: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. Я также использовал класс(), чтобы убедиться, что каждая переменная является типом символа. Как вектор символов в сочетании с кадром данных типа символа изменит все на факторы?
Пожалуйста, помогите. Спасибо.
'data.frame' преобразует символы в факторы, если у вас нет' strAsAsFactors = FALSE'; Я предполагаю, что он вызван, когда вы переверните список в data.frame. Однако создание кадра данных с циклом 'for' действительно нецелесообразно; что вы на самом деле пытаетесь достичь? – alistaire
Спасибо! Я знаю, что я, вероятно, должен был использовать tapply, lapply или apply, но цикл 'for' просто проще обернуть голову вокруг этого вложенного файла list/json. В основном, данные, которые я хочу получить, из 16 столбцов данных, причем один из столбцов является вложенным списком с тремя уровнями. Кроме того, количество элементов этого списка зависит от каждой строки данных. Но теперь, используя метод @Arun kumar mahesh, я решил эту проблему. Мне нужно вернуться позже, чтобы найти более эффективный способ сделать это. Но на данный момент у меня не хватает времени. Благодарю. – Rui
На самом деле, ваш совет был прав: «Создание 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