在here给出的列表中的两个元素不符合模式。这意味着,在将@ akrun的代码应用到该列表后,我遇到了以下问题:
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"
在不影响整体列表结构的情况下,如何制作&#34; B&#34;和&#34; C&#34;各自元素的标题,以便:
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"
我设法解决了这样的实际问题:
> 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"
答案 0 :(得分:2)
以下是我们stack
list
到2列'data.frame'('d1')的一个选项。将其转换为data.table
(setDT(d1)
),指定具有逻辑条件的i
,即检查“值”中的大写元素并将这些值分配给{ind :=
关于那个位置的专栏。基于使用'ind'中unique
元素的位置与行序列进行比较而创建的分组变量,获取累积和,使用它将'ind'指定为'ind'的第一个元素({{ 1}}),保留“值”不等于“ind”的行和“ind”列的“{1”}“值”
ind[1]
或者我们可以尝试使用split
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