使用分隔符从原始向量创建多个新向量

时间:2019-02-13 15:56:04

标签: r

我正在尝试从原始矢量创建多个矢量。 我读了一些帖子,但找不到解决我问题的方法。

我的原始向量看起来像这样:

dateutil

我想要看起来像这样的向量:

> orig_vec
[1] "A"  "B"  "C"  "D;" "1"  "2;" "a1" "a2" "a3"

所以我需要的是一个将分号识别为分隔符并根据“ orig_vec”中分隔值的数量创建新向量的代码。

我还有一个问题,即“ orig_vec”可以更改。 看起来像这样:

> vector1
[1] "A" "B" "C" "D"
> vector2
[1] "1" "2"
> vector3
[1] "a1" "a2" "a3"

我需要自动获取这些向量:

> orig_vec
[1] "A"   "B"   "C"   "D"   "E;"  "1"   "2;"  "a1"  "a2"  "a3;" "b1" 

很抱歉,我无法提供更多代码或解决方案的任何想法。

4 个答案:

答案 0 :(得分:4)

这应该有效:

source 'https://github.com/CocoaPods/Specs.git'
source '<Private Podspec>'

我们使用条件x <- c("A", "B", "C", "D;", "1", "2;", "a1", "a2", "a3") sapply(split(x, c(0, cumsum(grepl(";", x))[-length(x)])), function(x) gsub(";", "", x)) $`0` [1] "A" "B" "C" "D" $`1` [1] "1" "2" $`2` [1] "a1" "a2" "a3" 的{​​{1}}创建一个向量,以用cumsum()进行子集设置,然后通过grepl(";", x)split()删除分号。

答案 1 :(得分:3)

我也喜欢@LAP,这是另一个选择:

vec <- c("A", "B", "C", "D;", "1", "2;", "a1", "a2", "a3;", "b1")

ix <- grep(";", vec)

mapply(function(x, ix1, ix2) x[ix1:ix2], 
       x = list(sub(";", "", vec)),
       ix1 = c(1, ix + 1),
       ix2 = c(ix, length(vec)))

[[1]]
[1] "A" "B" "C" "D"

[[2]]
[1] "1" "2"

[[3]]
[1] "a1" "a2" "a3"

[[4]]
[1] "b1"

您会注意到,大多数人都在给您答案,从而得到向量列表,而不是少数分配给变量名的向量。通常,使用对象列表(而不是分散在名称空间中的对象)更干净,更容易。只是增加了$ .02。

答案 2 :(得分:2)

这是一种方法,基于以下想法:首先在一个空间上连接,然后依次分裂,首先在;上,然后在一个空间上:

s <- c("A",  "B",  "C",  "D;", "1" , "2;" ,"a1", "a2", "a3")
s <- paste0(s,collapse = ' ')
s <- unlist(strsplit(s, ';'))
vectors <- lapply(s,function(x) unlist(strsplit(trimws(x),' ')))

> vectors
[[1]]
[1] "A" "B" "C" "D"

[[2]]
[1] "1" "2"

[[3]]
[1] "a1" "a2" "a3"

答案 3 :(得分:1)

只需要在单个管道中工作的简单方法即可。

类似于其他答案,将向量折叠为单个字符串,然后在每个;上拆分该字符串。我使用空格作为折叠处,因此以后可以轻松使用str_trim

library(tidyverse)

x %>%
  paste(collapse = " ") %>%
  strsplit(split = ";", fixed = T)
#> [[1]]
#> [1] "A B C D E" " 1 2"      " a1 a2 a3" " b1"

由于strsplit为您提供了一个列表,至少在这种情况下,您只对第一个列表项感兴趣,因此请使用[[将其拉出,并剪裁那些列表的开头和结尾的空格向量。 map为您提供了一个由一个字符串组成的向量列表。

x %>%
  paste(collapse = " ") %>%
  strsplit(split = ";", fixed = T) %>%
  `[[`(1) %>%
  map(str_trim)
#> [[1]]
#> [1] "A B C D E"
#> 
#> [[2]]
#> [1] "1 2"
#> 
#> [[3]]
#> [1] "a1 a2 a3"
#> 
#> [[4]]
#> [1] "b1"

然后将每个向量除以空格,然后展平为一个向量列表。

多合一管道:

x %>%
  paste(collapse = " ") %>%
  strsplit(split = ";", fixed = T) %>%
  `[[`(1) %>%
  map(str_trim) %>%
  map(str_split, " ") %>%
  flatten()
#> [[1]]
#> [1] "A" "B" "C" "D" "E"
#> 
#> [[2]]
#> [1] "1" "2"
#> 
#> [[3]]
#> [1] "a1" "a2" "a3"
#> 
#> [[4]]
#> [1] "b1"

reprex package(v0.2.1)于2019-02-13创建