R 重新列出包含数据帧的列表
我有要编辑的嵌套列表。为了方便起见,我想使用R 重新列出包含数据帧的列表,r,dataframe,R,Dataframe,我有要编辑的嵌套列表。为了方便起见,我想使用unlist和relist。问题在于relist似乎不尊重底层结构: # Some list my_list <- list(vec = 'string', df = data.frame(X=0,Y=0,Z=0)) str(my_list) # List of 2 # $ vec: chr "string" # $ df :'data.frame': 1 obs. of 3 variables: #
unlist
和relist
。问题在于relist
似乎不尊重底层结构:
# Some list
my_list <- list(vec = 'string',
df = data.frame(X=0,Y=0,Z=0))
str(my_list)
# List of 2
# $ vec: chr "string"
# $ df :'data.frame': 1 obs. of 3 variables:
# ..$ X: num 0
# ..$ Y: num 0
# ..$ Z: num 0
# Unlist to modify nested content
my_unlist <- unlist(my_list)
str(my_unlist)
# Named chr [1:4] "string" "0" "0" "0"
# - attr(*, "names")= chr [1:4] "vec" "df.X" "df.Y" "df.Z"
# Write some data
my_unlist[c("df.X","df.Y","df.Z")] <- c(0,1,1)
str(my_unlist)
# Named chr [1:4] "string" "0" "1" "1"
# - attr(*, "names")= chr [1:4] "vec" "df.X" "df.Y" "df.Z"
# Relist
my_relist <- relist(flesh = my_unlist, skeleton = my_list)
str(my_relist)
# List of 2
# $ vec: chr "string"
# $ df : Named chr [1:3] "0" "1" "1"
# ..- attr(*, "names")= chr [1:3] "X" "Y" "Z"
但这并没有多大帮助,因为我想任意执行此操作
理想情况下,我会有一个函数,在保留结构的同时,用myunlist
的内容填充myu列表。因此,预期的产出将是
my_relist
# $vec
# [1] "string"
#
# $df
# X Y Z
# 1 0 1 1
编辑
下面是一些示例数据以及更详细的示例
# Sample data: a simple json
test_json <- '{
"email": "string",
"locations": [
{
"address": {
"city": "string",
"country": "string",
"houseNr": "string",
"state": "string",
"streetName": "string",
"zipCode": "string"
},
"latitude": 0,
"longitude": 0,
"name": "string"
}
],
"phone": "string"
}'
# Reading the json sample
json <- jsonlite::fromJSON(test_json)
# Now we unlist json so that we can easily modify nested elements
json_unlist <- unlist(json)
# Let's add a few address components
fields_to_modify <- c("locations.address.houseNr","locations.address.streetName","locations.address.city","locations.address.country")
json_unlist[fields_to_modify] <- c("1", "Boulevard de Londres","Casablanca","Morocco")
# Now we want to convert it back to json
# First step: we must relist
attempt <- relist(flesh = json_unlist, skeleton = json)
attempt$locations
# address latitude longitude name
# "Casablanca" "Morocco" "1" "string"
# <NA> <NA> <NA> <NA>
# "Boulevard de Londres" "string" "0" "0"
# <NA>
# "string"
#示例数据:一个简单的json
使用问题中的json
测试_json,注意,例如,由于以下内容具有相同的含义:
json[["locations"]][["address"]][["city"]]
json[[c("locations", "address", "city")]]
假设在命名未列出的对象时使用点,如问题中所示,我们可以使用Map
如下:
setList <- function(List, Unlist) {
nms <- names(Unlist)
Map(function(x, y) List[[x]] <<- Unlist[[y]], strsplit(nms, "\\."), nms)
List
}
setList(my_list, my_unlist)
setList(json, json_unlist)
setList使用问题中的json
,请注意,例如,由于以下内容具有相同的含义:
json[["locations"]][["address"]][["city"]]
json[[c("locations", "address", "city")]]
假设在命名未列出的对象时使用点,如问题中所示,我们可以使用Map
如下:
setList <- function(List, Unlist) {
nms <- names(Unlist)
Map(function(x, y) List[[x]] <<- Unlist[[y]], strsplit(nms, "\\."), nms)
List
}
setList(my_list, my_unlist)
setList(json, json_unlist)
setList为避免混淆,能否显示所需的输出?或者,my_relist
是您想要的吗?@markus预期的输出是(str(my_relist)
)中显示的my_relist
)-我仍然会立即添加实际内容。因此,在这个特定的示例中,您正试图做的是my_list$df[,c(“Y”,“Z”)]。假设现在my_list
包含多个数据帧或子列表,您只需更改saymy_list$df_7[,c(“A”,“H”)]
或my_list$df_1[,“Z”]
。那么,这并不是说简单明了,而且unlist
似乎足以胜任这项任务。我想我已经明白了。因此,您有一个包含字符向量和多个数据帧的列表,您需要一种方法来更改数据帧中的一些条目。你能用解决这个问题的示例数据更新你的问题吗?为了避免混淆,你能展示你想要的输出吗?或者,my_relist
是您想要的吗?@markus预期的输出是(str(my_relist)
)中显示的my_relist
)-我仍然会立即添加实际内容。因此,在这个特定的示例中,您正试图做的是my_list$df[,c(“Y”,“Z”)]。假设现在my_list
包含多个数据帧或子列表,您只需更改saymy_list$df_7[,c(“A”,“H”)]
或my_list$df_1[,“Z”]
。那么,这并不是说简单明了,而且unlist
似乎足以胜任这项任务。我想我已经明白了。因此,您有一个包含字符向量和多个数据帧的列表,您需要一种方法来更改数据帧中的一些条目。您能否使用解决此问题的示例数据更新您的问题?