我正在尝试从原始矢量创建多个矢量。 我读了一些帖子,但找不到解决我问题的方法。
我的原始向量看起来像这样:
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"
很抱歉,我无法提供更多代码或解决方案的任何想法。
答案 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创建