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)]