% matrix(ncol = 2, byrow = TRUE) %>% as.data">
gpt4 book ai didi

r - 按规则模式的间距向量

转载 作者:行者123 更新时间:2023-12-04 17:43:25 25 4
gpt4 key购买 nike

我有一个向量

vec <- c("ab", "#4", "gw", "#29", "mp", "jq", "#35", "ez")

它通常遵循在两个不同的字符串序列之间交替的模式(第一个序列都是字母序列,第二个序列是带有符号 # 的数字)。

然而,有些情况下没有出现 # 项:所以在上面的 mp 之间和 jq ,然后在 ez 之后再次.我想用字符串 # 定义一个“填补空白”的函数,这样我就会有输出:
 [1] "ab" "#4" "gw" "#29" "mp" "#" "jq" "#35" "ez" "#"

然后我将其转换为数据框
   V1  V2
1 ab #4
2 gw #29
3 mp #
4 jq #35
5 ez #

到目前为止,我的尝试相当笨拙,并且依赖于遍历向量并填补空白。我有兴趣看到更优雅的解决方案。

我的解决方案
greplSpace <- function(pattern, replacement, x){

j <- 1

while( j < length(x) ){
if(grepl(pattern, x[j+1]) ){
j <- j+2
} else {
x <- c( x[1:j], replacement, x[(j+1):length(x)] )
j <- j+2
}
}

if( ! grepl(pattern, tail(x,1) ) ){ x <- c(x, replacement) }

return(x)
}

library(magrittr)

vec <- c("ab", "#4", "gw", "#29", "mp", "jq", "#35", "ez")

vec %>% greplSpace("#", "#", . ) %>%
matrix(ncol = 2, byrow = TRUE) %>%
as.data.frame

最佳答案

从您的 vec 开始,我们可以使用 中的一些函数直接创建您期望的数据框, , 和 .

library(dplyr)
library(tidyr)
library(stringr)

vec <- c("ab", "#4", "gw", "#29", "mp", "jq", "#35", "ez")

dat <- data_frame(Value = vec)

dat2 <- dat %>%
mutate(String = !str_detect(vec, "#"),
Key = ifelse(String, "V1", "V2"),
Row = cumsum(String)) %>%
select(-String) %>%
spread(Key, Value, fill = "#") %>%
select(-Row)

dat2
# # A tibble: 5 x 2
# V1 V2
# <chr> <chr>
# 1 ab #4
# 2 gw #29
# 3 mp #
# 4 jq #35
# 5 ez #

关于r - 按规则模式的间距向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50112232/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com