我是R的新手,在迭代价值方面遇到了一些麻烦。
对于上下文:随着时间的推移,我有60个人的数据,每个人在一个文件夹中有他/她自己的数据集(我收到了id为#s 00:59的数据)。对于每个人,我需要2个值 - 响应时间和给出的图片响应(数字1 - 16)。我需要为每个人将这些数据从宽格式转换为长格式,然后最终将所有数据集附加在一起。
我的问题是我在编写一个循环时遇到问题,这个循环会为每个人(即每个数据集)执行此操作。这是我到目前为止的代码:
pam[x] <- fromJSON(file = "PAM_u[x].json")
pam[x]df <- as.data.frame(pam[x])
#Creating long dataframe for times
pam[x]_long_times <- gather(
select(pam[x]df, starts_with("resp")),
key = "time",
value = "resp_times"
)
#Creating long dataframe for pic_nums (affect response)
pam[x]_long_pics <- gather(
select(pam[x]df, starts_with("pic")),
key = "picture",
value = "pic_num"
)
#Combining the two long dataframes so that I have one df per person
pam[x]_long_fin <- bind_cols(pam[x]_long_times, pam[x]_long_pics) %>%
select(resp_times, pic_num) %>%
add_column(id = [x], .before = 1)
如果您将上述代码中的[x]替换为人的ID#(例如00),则代码将运行并将为我提供我想要的数据帧。有关如何做到这一点的任何建议,所以我可以完成所有60人?
谢谢!
修改
因此,使用library(jsonlite)
而不是library(rjson)
以我需要的格式设置文件,而无需进行所有操作。谢谢大家的回复,但解决方案显然比我想象的要容易得多。
答案 0 :(得分:0)
我不知道你的json文件的结构。如果您不在json文件所在的文件夹中,请尝试:
library(jsonlite)
# setup - read files
json_folder <- "U:/test/" #adjust you folder here
files <- list.files(path = paste0(json_folder), pattern = "\\.json$")
# import data
pam <- NULL
pam_df <- NULL
for (i in seq_along(files)) {
pam[[i]] <- fromJSON(file = files[i])
pam_df[[i]] <- as.data.frame(pam[[i]])
}
在这里,您通常会读取文件夹中的所有json文件,并构建一个长度为60的向量。
比沿着该向量排序并读取所有文件。
我假设最后你可以做bind_rows
或在for循环中添加你的代码。但请记住在循环开始之前将数据帧设置为NULL
,例如pam_long_pics <- NULL
希望有帮助吗?让我知道。
答案 1 :(得分:0)
这些方面的某些方面可行:
#library("tidyverse")
#library("jsonlite")
file_list <- list.files(pattern = "*.json", full.names = TRUE)
Data_raw <- tibble(File_name = file_list) %>%
mutate(File_contents = map(File_name, fromJSON)) %>% # This should result in a nested tibble
mutate(File_contents = map(File_contents, as_tibble))
Data_raw %>%
mutate(Long_times = map(File_contents, ~ gather(key = "time", value = "resp_times", starts_with("resp"))),
Long_pics = map(File_contents, ~ gather(key = "picture", value = "pic_num", starts_with("pic")))) %>%
unnest(Long_times, Long_pics) %>%
select(File_name, resp_times, pic_num)
编辑:在阅读JSON文件后,您可能需要也可能不需要包含as_tibble()
,具体取决于数据的外观。