使用apply函数删除数据框中的每一行

时间:2015-03-25 13:28:11

标签: r

我输入了一个名为in.json的文件。您可以找到此文件的内容here

使用此answer我尝试使用以下代码将json转换为csv:

require(RJSONIO)
require(rjson)
library("rjson")
filename2 <- "C:/Users/Desktop/in.json"
json_data <- fromJSON(file = filename2)

json_data <- lapply(json_data, function(x) {
  x[sapply(x, is.null)] <- NA
  unlist(x)
})

json <- do.call("rbind", json_data)

df=json


write.csv(df,file='C:/Users/Desktop/final.csv', row.names=FALSE)

然而,当我输入nrow(df)时,我可以看到我只有2行,但根据项目的每个id,我需要更多的行。

1 个答案:

答案 0 :(得分:2)

您提供的json作为示例确实在数组中只有两个对象。该结构忠实地显示为被调用str

> str(json_data,max.level=2)
List of 2
 $ :List of 3
  ..$ projects  :List of 1
  ..$ total_hits: num 12596
  ..$ seed      : chr "776766" 
 $ :List of 3
  ..$ projects  :List of 16
  ..$ total_hits: num 12596
  ..$ seed      : chr "776766"

猜测你的意思是项目ID,并且你不介意放弃&#34; total_hits&#34;和 你只需要取消json的前两个级别:

 unlisted <- unlist(unlist(json_data,recursive=FALSE),recursive=FALSE)

然后选择名为projects *的项目:

 projects <- unlisted[grep("^projects*",names(unlisted))]

然后您可以使用以下方式取消列出:

data <- lapply(projects,unlist)

Rbinding比较棘手,因为你没有在所有项目中填写完全相同的字段,你需要依赖名称,以下是众多解决方案中的一个,可能不是最佳解决方案之一:

# list all the names in all projects
allNames <- unique(unlist(lapply(data,names)))
# have a model row
modelRow <- rep(NA,length(allNames))
names(modelRow)<-allNames

# the function to change your list into a row  following modelRow structure
rowSettingFn <- function(project){
    row <- modelRow
    for(iItem in 1:length(project)){
        row[names(project)[iItem]] <- project[[iItem]]
    }
    return(row)
}

# change your data into a matrix
dataMat <- sapply(data,rowSettingFn)