我想在一列中加入两个值而不是传播
'{"name": {"first": "bob", "last": "jones"}, "age": 32}' %>%
spread_values(
first.name = jstring("name", "first"),
age = jnumber("age")
) %>%
unite(conc, c("first.name", "age"), sep=" ")
但我一直有以下错误
所有select()输入必须解析为整数列位置。 以下不: c(" first.name"," age")
我的愿望输出是有一个新专栏" conc"替换first.name和age,并连接每个字符串值。例如" jones 32"
这很奇怪,因为如果我删除最后一行,它会给我一个正确的data.frame,我可以访问first.name和age。
任何提示?
答案 0 :(得分:0)
虽然tbl_json
个对象是从tbl_df
继承的,但是一旦完成解析并开始在tidyjson
和dplyr
中进行进一步操作,它们有时就不能很好地发挥作用。原因是你有额外的方法和属性标记,这是不再需要的。
因此,一旦完成解析,使用tbl_df
或as_data_frame
去除对象的tbl_json
组件是一个好习惯。我更喜欢tbl_df
,因为它更短。
我正在使用github的开发版本:devtools::install_github('jeremystan/tidyjson')
我无法重现您提到的错误,但这似乎有效:
library(tidyjson)
library(tidyr)
"{\"name\": {\"first\": \"bob\", \"last\": \"jones\"}, \"age\": 32}" %>%
spread_values(first.name = jstring("name","first")
, age = jnumber("age")
) %>%
tbl_df() %>%
unite(conc, c("first.name", "age"), sep = " ")
#> # A tibble: 1 x 2
#> document.id conc
#> * <int> <chr>
#> 1 1 bob 32
连接字符串时需要考虑的其他因素是在paste()
中使用paste0()
或mutate
。 mutate
也支持tidyjson
,因此可以在解析JSON时在管道中使用它。使用paste(.,collapse=',')
汇总多行时,summarize
非常有用。
答案 1 :(得分:0)
library(jsonlite)
json <- lapply( paste0("[",'{"name": {"first": "bob", "last": "jones"}, "age": 32}',"]"),
function(x) jsonlite::fromJSON(x))
##json is a list
df <- data.frame(matrix(unlist(json), nrow=1, ncol=3, byrow=T))
df <- df %>% unite(Name, X1, X3, sep = " ")
df <- subset(df, select=-X2)
colnames(df) <- c("conc")
df