R - 将列表元素放入标题中

时间:2017-09-30 14:53:57

标签: r list structure element

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"

1 个答案:

答案 0 :(得分:2)

以下是我们stack list到2列'data.frame'('d1')的一个选项。将其转换为data.tablesetDT(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