Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 从任意深度的列表中提取值_R - Fatal编程技术网

R 从任意深度的列表中提取值

R 从任意深度的列表中提取值,r,R,我有一个凌乱的、高度嵌套的列表: m <- list('form' = list('elements' = list('name' = 'Bob', 'code' = 12), 'name' = 'Mary', 'code' = 15)) 如何从对象m中提取名称和代码,而不管在列表中如何嵌套名称和代码 预期产出: # A tibble: 2 x 2 name code <chr> <dbl> 1 Bob 12 2 Mary 15 #

我有一个凌乱的、高度嵌套的列表:

m <- list('form' = list('elements' = list('name' = 'Bob', 'code' = 12), 'name' = 'Mary', 'code' = 15))
如何从对象
m
中提取
名称
代码
,而不管在列表中如何嵌套
名称
代码

预期产出:

# A tibble: 2 x 2
  name   code
  <chr> <dbl>
1 Bob      12
2 Mary     15
#一个tible:2x2
名称代码
1鲍勃12
2玛丽15

这有助于将列表格式化为数据帧,然后对其进行重塑:

library(tidyverse)
#Process
y1 <- as.data.frame(lapply(m,unlist),stringsAsFactors = F)
y1$id <- rownames(y1)
rownames(y1)<-NULL
#Dplyr mutation
y1 %>% mutate(Var=ifelse(grepl('name',id,),'name',
                         ifelse(grepl('code',id),'code',NA))) %>%
  select(-id) %>% group_by(Var) %>%
  mutate(i=1:n())%>% pivot_wider(names_from = Var,values_from = form) %>%
  select(-i) %>% mutate(code=as.numeric(code))
库(tidyverse)
#过程
y1%组别单位(Var)%>%
变异(i=1:n())%%>%pivot\u更宽(名称\u from=Var,值\u from=form)%%>%
选择(-i)%>%mutate(代码=as.numeric(代码))
输出:

# A tibble: 2 x 2
  name   code
  <chr> <dbl>
1 Bob      12
2 Mary     15
#一个tible:2x2
名称代码
1鲍勃12
2玛丽15
1)rrapply使用
rrapply
m
展平,给出
r
,然后使用
tapply
分离
未列出(r)
的名称和代码字段,使用
c
删除维度,转换为data.frame并设置列的顺序

请注意,这不是硬编码的名称和代码,将与其他领域和领域的数字

library(rrapply)

r <- rrapply(m, f = c, how = "flatten")
nms <- names(r)
as.data.frame(c(tapply(unname(r), nms, unlist)))[unique(nms)]
上述最后两行代码的替代方案是:

out <- unstack(stack(r))
out[] <- lapply(out, type.convert)
2)基本R基本R解决方案如下所示:取消列出
m
,然后使用
tapply
,如(1)按
名称(R)
的后缀分组。与(1)类似,这是一种通用方法,不是硬编码到
name
code
。请注意,工具随R一起提供,因此它是基本R的一部分

r <- unlist(m)
nms <- tools::file.ext(names(r))
as.data.frame(c(tapply(unname(r), nms, unlist)))[unique(nms)]
r也许
x也许你的答案会有所帮助。
out <- unstack(stack(r))
out[] <- lapply(out, type.convert)
cond <- function(x, .xname) .xname %in% c("name", "code")
r <- rrapply(m, cond, c, how = "flatten")
r <- unlist(m)
nms <- tools::file.ext(names(r))
as.data.frame(c(tapply(unname(r), nms, unlist)))[unique(nms)]