R: применить as.list к фрейму данных, преобразует цифры в символы - PullRequest
1 голос
/ 25 марта 2019

При попытке преобразовать фрейм данных в список, напоминающий вложенный словарь, я попытался с помощью следующей команды:

 df = data.frame(col1 = c('a', 'b'), col2 = c(1, 2))
 df[,1] = as.character(df[,1])

 ls1 = apply(df, 1, as.list)
 print(ls1)

Однако теперь значения col2 в ls1, похоже, преобразуются в символ:

 class(ls1[[2]]$col2)
 # [1] "character"

Этот обходной путь работает, но мне любопытно, если кто-нибудь знает, почему результат не такой, как в предыдущем коде?

 ls2 = as.list(df[1,])
 for(i in 2:nrow(df)){
   ls2 = list(ls2, as.list(df[i,]))
 }
 print(ls2)

 class(ls1[[2]]$col2)
 # [1] "numeric"

1 Ответ

2 голосов
/ 25 марта 2019

Вместо apply, который преобразует данные в matrix и matrix может иметь только один класс, используйте split

lst1 <- unname(split(df, seq_len(nrow(df))))

Если нам нужен вывод JSON, набор данных можно напрямую преобразовать в JSON с помощью toJSON

jsonlite::toJSON(df)
#[{"col1":"a","col2":1},{"col1":"b","col2":2}] 

На основе разговора с OP набор данных передается как имя list, которое необходимо преобразовать в формат JSON

toJSON(list(listName = df))
#{"listName":[{"col1":"a","col2":1},{"col1":"b","col2":2}]} 
...