2015-05-05 15 views
6

Tôi có json tệp có dữ liệu cho các quốc gia. Một trong các tập tin có dữ liệu sau:"NA" trong tệp JSON dịch sang NA lôgic

"[{\"count\":1,\"subject\":{\"name\":\"Namibia\",\"alpha2\":\"NA\"}}]" 

Tôi đã đoạn mã sau chuyển đổi json thành một data.frame sử dụng jsonlite gói:

df = as.data.frame(fromJSON(jsonfile), flatten=TRUE)) 

Tôi đã chờ đợi một data.frame với những con số và chuỗi:

count subject.name subject.alpha2 
1  Namibia    "NA" 

Thay vào đó, mã NA alpha2 đang được tự động chuyển đổi thành NA hợp lý và đây là những gì tôi nhận được:

str(df) 
$ count   : int 1 
$ subject.name : chr "Namibia" 
$ subject.alpha2: logi NA 

Tôi muốn alpha2 là một chuỗi, không hợp lý. Làm thế nào để sửa lỗi này?

+1

Chào mừng bạn đến với SO. tốt câu hỏi đầu tiên. Hãy thử thêm một số dữ liệu mẫu khác mà mọi người có thể chơi cùng. – vagabond

+1

Chỉ cần ép buộc thành 'ký tự'. Nó có lẽ không cần thiết để làm như vậy bởi vì R sẽ làm điều đó ép buộc ở nhu cầu đầu tiên. –

+0

@BondedDust Cảm ơn. Yeah, R có sự ép buộc lúc đầu, nhưng có một số tập tin chỉ với dữ liệu cho Namibia. Có cách nào để ép buộc vào 'ký tự' khi chuyển đổi json thành' dataframe'? – Armin

Trả lời

1

Đó thực hiện cụ thể của fromJSON (và có ba gói khác nhau với tên đó cho một chức năng) có một cuộc tranh luận simplifyVector xuất hiện để ngăn chặn sự corecion:

require(jsonlite) 

> as.data.frame(fromJSON(test, simplifyVector=FALSE)) 
    count subject.name subject.alpha2 
1  1  Namibia    NA 
> str(as.data.frame(fromJSON(test, simplifyVector=FALSE))) 
'data.frame': 1 obs. of 3 variables: 
$ count   : int 1 
$ subject.name : Factor w/ 1 level "Namibia": 1 
$ subject.alpha2: Factor w/ 1 level "NA": 1 
> str(as.data.frame(fromJSON(test, simplifyVector=FALSE) ,stringsAsFactors=FALSE)) 
'data.frame': 1 obs. of 3 variables: 
$ count   : int 1 
$ subject.name : chr "Namibia" 
$ subject.alpha2: chr "NA" 

Tôi cố gắng nhìn thấy nếu tùy chọn đó làm việc tốt với đối số flatten nhưng đã thất vọng:

> str( fromJSON(test, simplifyVector=FALSE, flatten=TRUE)) 
List of 1 
$ :List of 2 
    ..$ count : int 1 
    ..$ subject:List of 2 
    .. ..$ name : chr "Namibia" 
    .. ..$ alpha2: chr "NA" 
+0

'simplifyVector = FALSE' đã thực hiện thủ thuật. Cảm ơn. – Armin