我有一些文本数据在读入R:
后以下列格式显示> lst <- list('A', c("", 'aa'), 'bb', 'cc', 'B', c("", 'aa'), 'bb', 'cc', 'dd')
[[1]]
[1] "A"
[[2]]
[1] "" "aa"
[[3]]
[1] "bb"
[[4]]
[1] "cc"
[[5]]
[1] "B"
[[6]]
[1] "" "aa"
[[7]]
[1] "bb"
[[8]]
[1] "cc"
[[9]]
[1] "dd"
是否有一种简单的方法可以使用“”作为指标来更改此列表的结构,以便紧接在“”之前的项目成为列表标题?
lst2 <- list(A=c('aa', 'bb', 'cc'), B=c('aa', 'bb', 'cc', 'dd'))
$A
[1] "aa" "bb" "cc"
$B
[1] "aa" "bb" "cc" "dd"
答案 0 :(得分:4)
我们可以unlist
list
到vector
(&#39; v1&#39;),然后根据空字符串的位置创建分组索引({{1删除第一个元素并在末尾追加FALSE,得到累积和,使组在空字符串出现之前的位置开始。然后,我们在!nzchar(v1)
中使用它,删除向量的第一个元素并使用group by操作来获取向量的第一个元素,用于命名&#39; lst2&#39;
tapply
答案 1 :(得分:3)
另一个可能的选择:
spl_vals <- c("")
idxs <- lapply(lst, function(x) as.numeric(any(spl_vals %in% x))) #Find location of split values
c_idxs <- cumsum(idxs) #Use cumsum to group sets of values
c_idxs[which(idxs==1) - 1] <- 0 #Assign the value before each split to be 0. This will be the name of the element
spl <- split(lst, c_idxs) #Split you list into (1) names of elements and (2) individual elements
newlist <- lapply(spl, function(x) unlist(x)[!unlist(x) %in% spl_vals]) #Remove any split values
nms <- names(newlist) #Extract names of list (this is just for shortening the next line of code)
setNames(newlist[nms[!nms %in% "0"]], newlist[["0"]]) #Set names of elements
$A
[1] "aa" "bb" "cc"
$B
[1] "aa" "bb" "cc" "dd"
请注意,这并没有从一开始就使用unlist
,所以如果您有多个分割值,并且您希望两个元素具有不同的类型(例如字符和整数),则会保留该类型。例如,使用:
lst <- list('A', c("", 'aa'), 'bb', 'cc', 'B', c(0, 1), 2, 3, 4)
spl_vals <- c("",0)
你得到:
$A
[1] "aa" "bb" "cc"
$B
[1] 1 2 3 4