首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使列表元素成为标头

使列表元素成为标头
EN

Stack Overflow用户
提问于 2017-09-30 14:53:57
回答 1查看 1.3K关注 0票数 1

在通过here给出的列表中,有两个元素不符合模式。这意味着,在将@akrun的代码应用到该列表之后,我将面临以下问题:

代码语言:javascript
复制
lst <- list(A = c('aa','bb','B', 'cc', 'dd', 'C', 'ee', 'ff'), D = (c('aa', 'bb')))

$A
 [1] "aa" "bb" "B" "cc" "dd" "C"  "ee" "ff"

$D
[1] "aa" "bb"

在不影响整个列表结构的情况下,我如何使各自元素的"B“和"C”标题:

代码语言:javascript
复制
lst2 <- list(A=c('aa', 'bb'), B=c('cc', 'dd'), C=c('ee', 'ff'), D=c('aa', 'bb'))

$A
[1] "aa" "bb"

$B
[1] "cc" "dd"

$C
[1] "ee" "ff"

$D
[1] "aa" "bb"

我设法想出了一个解决实际问题的方法,如:

代码语言:javascript
复制
> lst <- list('隱公元年', c("", 'aa'), 'bb', 'cc', '莊公十年', 'aa', 'bb', '襄公二十四年', c("", 'dd'), '成公三年', 'ee')

> v1 <- unlist(lst)
> v2 <- lapply(v1, function(x){x[!x ==""]}) %>% compact %>% unlist() #Remove empty string

> i1 <- cumsum(grepl(".公+[元一二三四五六七八九十]+年$", v2)) #Generate index based on Regex of intended headers. 

> zz <- tapply(v2, i1, FUN = function(x) x[-1]) #Apply index to dataset, ignoring first element (which is the header). 
> names(zz) <- tapply(v2, i1, FUN = head, 1) #Apply headers to dataset. 

> zz
$隱公元年
[1] "aa" "bb" "cc"

$莊公十年
[1] "aa" "bb"

$襄公二十四年
[1] "dd"

$成公三年
[1] "ee"
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-30 17:22:03

这里有一个选项,我们将stack list设置为2列'data.frame‘('d1')。将其转换为data.table (setDT(d1)),指定具有逻辑条件的i,即检查' values‘中的大写元素,并将这些值赋值(:=)给该位置上的'ind’列。根据与行序列中unique元素的位置一起创建的分组变量,获取累积和,将'ind‘指定为'ind’(ind[1])的第一个元素,保留‘value’不等于'ind‘的行,并将'ind’列中的‘split’指定为'ind‘列的’split‘。

代码语言:javascript
复制
d1 <- stack(lst)
library(data.table)
d2 <- setDT(d1)[grepl("[A-Z]", values), ind := values][, 
  ind := ind[1L] , cumsum(seq_len(nrow(d1)) %in% match(unique(ind), ind))][values != ind]
split(d2$values, d2$ind)
#$A
#[1] "aa" "bb" "cc"

#$D
#[1] "aa" "bb"

#$B
#[1] "aa" "bb" "cc" "dd"

#$C
#[1] "ee" "ff"

或者我们可以试试tidyverse

代码语言:javascript
复制
library(purrr)
library(dplyr)
fsplitLst <- function(lstt){

f1 <- function(x) {
     i1 <- grepl("[A-Z]", x)
     grp <- cumsum(i1)
     split(x[!i1], grp[!i1])
     
   }
 map(lstt, f1) %>%
        flatten %>%
        set_names(., map2(names(lstt), lstt, ~grep("[A-Z]", c(.x, .y), value = TRUE)) %>%
           unlist)
 }
fsplitLst(lst)
#$A
#[1] "aa" "bb" "cc"

#$B
#[1] "aa" "bb" "cc" "dd"

#$C
#[1] "ee" "ff"

#$D
#[1] "aa" "bb"

数据

代码语言:javascript
复制
lst <- list(A = c('aa','bb','cc', 'B', 'aa','bb', 'cc', 'dd', 'C', 'ee', 'ff'),
             D = c('aa', 'bb'))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46503870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档