Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 按第n个字符分隔字符列?_R_Dplyr_Tidyverse_Tidyr - Fatal编程技术网

R 按第n个字符分隔字符列?

R 按第n个字符分隔字符列?,r,dplyr,tidyverse,tidyr,R,Dplyr,Tidyverse,Tidyr,给定一个示例df: df <- structure(list(test_id = c("123-456789123", "785-525135627", "6545646545665456", "988898-65464654646464664", "987-656546464", "666-654564654" )), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame" )) 我已尝试使用单独的函数来执行此操

给定一个示例df:

df <- structure(list(test_id = c("123-456789123", "785-525135627", 
"6545646545665456", "988898-65464654646464664", "987-656546464", "666-654564654"
)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"
))
我已尝试使用单独的函数来执行此操作:

separate(df, col = test_id, into = c("prefix", "postfix"), sep = "(.{8}$)", convert = T)
但它没有给我第二部分


请告知。

更新粗略答案df2是df

library(tidyverse)
df2$text_id<-gsub("[-]", "\\1 \\2", df2$test_id)
df2$test_id
df2<-df2 %>% 
  mutate(text_id=str_remove_all(df2$text_id,"\\s"),
         text_id=substr(df2$text_id,1,5))
df2$tesxt_id<-str_replace_all(df2$text_id," ","-")
df2 %>% 
  separate(test_id,c("pre","post"),sep="\\d(?=\\d{8,})",convert = T) %>% 
  select(tesxt_id,post)

更新粗略答案df2是df

library(tidyverse)
df2$text_id<-gsub("[-]", "\\1 \\2", df2$test_id)
df2$test_id
df2<-df2 %>% 
  mutate(text_id=str_remove_all(df2$text_id,"\\s"),
         text_id=substr(df2$text_id,1,5))
df2$tesxt_id<-str_replace_all(df2$text_id," ","-")
df2 %>% 
  separate(test_id,c("pre","post"),sep="\\d(?=\\d{8,})",convert = T) %>% 
  select(tesxt_id,post)

不使用额外的软件包,而是使用
sapply
strsplit
(显然,您应该将内容包装到函数中,以获得更清晰的语法):


不使用额外的软件包,而是使用
sapply
strsplit
(显然,您应该将内容包装到函数中,以获得更清晰的语法):


请注意,所示的
df
不是data.frame,因此我们将其称为
x
。然后将其转换为数据帧,并与
sep=-8一起使用
separate

library(dplyr)
library(tidyr)
x <- df 

x %>% 
  data.frame %>%
  separate(test_id, into = c("pre", "post"), sep = -8)

请注意,所示的
df
不是data.frame,因此我们将其称为
x
。然后将其转换为数据帧,并与
sep=-8一起使用
separate

library(dplyr)
library(tidyr)
x <- df 

x %>% 
  data.frame %>%
  separate(test_id, into = c("pre", "post"), sep = -8)

这是在不丢失任何数字的情况下解决我的问题的方法。 记住,我们的目标是将8个字符从结尾分开,然后查看剩下的字符(最后8个字符的前缀)。 我需要知道我的数据中最后8个字符的唯一前缀是什么

df %>%
  as_tibble() %>%
  dplyr::mutate(test_id = str_sub(test_id, end = nchar(test_id) - 8))

这是在不丢失任何数字的情况下解决我的问题的方法。 记住,我们的目标是将8个字符从结尾分开,然后查看剩下的字符(最后8个字符的前缀)。 我需要知道我的数据中最后8个字符的唯一前缀是什么

df %>%
  as_tibble() %>%
  dplyr::mutate(test_id = str_sub(test_id, end = nchar(test_id) - 8))

您是否尝试过从库
stringr
中使用
stru sub
?尝试
separate(df,col=test\u id,into=c(“前缀”,“后缀”),sep=8,convert=TRUE)
@Sotos尝试过,但后缀是空列…哦,我没有注意到最后8个字符。@Sotos您帮了大忙。也许你可以解释一下
“\\d(?=\\d{8,})”
regex?你试过库
stringr
中的
stru sub
?试过
separate(df,col=test\u id,into=c(“prefix”,“postfix”),sep=8,convert=TRUE)
@Sotos试过了,但后缀是空列…哦,我没有注意到最后8个字符。@Sotos你帮了我很多忙。也许你可以解释一下
“\\d(?=\\d{8,})”
regex?如果我错了请纠正我:分开:找到一个后面有8个或更多数字的数字。给定123456789123,它会发现数字4是前面跟有8个或更多数字的数字@nelsongonYep,它会找到4的。非常感谢你,Nelson!哦,为什么?问题是我们丢失了一个数字。在上面的示例中,我们损失了6个。请在随问题一起提供的示例数据集上尝试。这是一个字符串,不是一个数字。我想在最后N个字符上分开如果我错了请纠正我:分开:找到一个在此之后有8个或更多数字的数字。给定123456789123,它会发现数字4是前面跟有8个或更多数字的数字@nelsongonYep,它会找到4的。非常感谢你,Nelson!哦,为什么?问题是我们丢失了一个数字。在上面的示例中,我们损失了6个。请在随问题一起提供的示例数据集上尝试。这是一个字符串,不是一个数字。我想在最后N个字符上分开
               pre     post
1            123-4 56789123
2            785-5 25135627
3         65456465 45665456
4 988898-654646546 46464664
5            987-6 56546464
6            666-6 54564654
df %>%
  as_tibble() %>%
  dplyr::mutate(test_id = str_sub(test_id, end = nchar(test_id) - 8))