【问题标题】:Create New Lists Based on List Structure Pattern基于列表结构模式创建新列表
【发布时间】:2020-12-10 08:25:25
【问题描述】:

我有一些看起来像这样的数据:

   dat <- c("Sales","Jim","Halpert","","",
            "Reception","Pam","Beasley","","",
            "Not.Manager","Dwight","Schrute","Bears","Beets","BattlestarGalactica","","",
            "Manager","Michael","Scott","","")

每个“块”数据都是连续的,中间有一些空格。我想将数据转换为如下所示的列表列表:

iwant <- c(
           c("Sales","Jim","Halpert"),
           c("Reception","Pam","Beasley"),
           c("Not.Manager","Dwight","Schrute","Bears","Beets","BattlestarGalactica"),
           c("Manager","Michael","Scott")
           )

建议?我正在使用 rvest 和 stringi。我不想添加更多包。

【问题讨论】:

  • datiwant 都是一个向量。

标签: r stringi


【解决方案1】:

您可以将rlesplitlapply 一起使用:

lapply(split(dat, with(rle(dat != ''), 
             rep(cumsum(values), lengths))), function(x) x[x!= ''])

#$`1`
#[1] "Sales"   "Jim"     "Halpert"

#$`2`
#[1] "Reception" "Pam"       "Beasley"  

#$`3`
#[1] "Not.Manager"         "Dwight"    "Schrute"     "Bears"   "Beets"            
#[6] "BattlestarGalactica"

#$`4`
#[1] "Manager" "Michael" "Scott"  

rle 部分在split 上创建组:

with(rle(dat != ''), rep(cumsum(values), lengths))
#[1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 3 3 3 4 4 4 4 4

split 之后,我们使用lapply 从每个列表中删除任何空元素。

【讨论】:

  • 您的答案对我的字符串中的空格和其他非字母数字字符很有效。那是我不知道自己在寻找的东西!
【解决方案2】:

我会建议下一个方法。您最终会得到一个数据框,其中的变量格式与您想要的类似:

#Split chains
L1 <- strsplit(paste0(dat,collapse = " "),split = "  ")
#Split vectors from each chain
L2 <- lapply(L1[[1]],function(x) strsplit(trimws(x),split = " "))
#Format
L2 <- lapply(L2,as.data.frame)
#Remove zero dim data
L2[which(lapply(L2,nrow)==0)]<-NULL
#Format names
L2 <- lapply(L2,function(x) {names(x)<-'v';return(x)})
#Transform to dataframe
D1 <- as.data.frame(do.call(cbind,L2))
#Rename
names(D1) <- paste0('V',1:dim(D1)[2])
#Remove recycled values
D1 <- as.data.frame(apply(D1,2,function(x) {x[duplicated(x)]<-NA;return(x)}))

输出:

       V1        V2                  V3      V4
1   Sales Reception         Not.Manager Manager
2     Jim       Pam              Dwight Michael
3 Halpert   Beasley             Schrute   Scott
4    <NA>      <NA>               Bears    <NA>
5    <NA>      <NA>               Beets    <NA>
6    <NA>      <NA> BattlestarGalactica    <NA>

【讨论】:

  • 我得到&gt; D1 &lt;- as.data.frame(do.call(cbind,L2)) Error in data.frame(..., check.names = FALSE) : arguments imply differing number of rows: 9, 8, 7, 4, 12' 我的实际数据包含空格,我认为这是原因。我的错是在原始问题的字符串中不包含空格。 Ronak 的回答适用于我的实际数据,所以我接受了他的回答,但你的回答在示例数据上效果很好。
猜你喜欢
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 2017-02-20
  • 2021-12-05
  • 2018-10-15
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
相关资源
最近更新 更多