我有以下列表元素。它包含原始文本,列基于字符长度。第一行总是427个字符宽。其余行宽375个字符。
我需要删除每一行中375个字符宽的最后9个字符。那将是航母位置367到375
df = structure(list(X1 = c("00000104900914254 1BBVA SEGUROS DE VIDA COLOMBIA S.A. NI800240882 0ACRA 11 87-51 001130000000 7777777 LUZ.MARTINEZ@xxxx.COM 2021-042021-04-22U 0004900000000213P0000000000022021-04-21",
"00000012CC1130000000 MORENO REINA DANIELA MORENO AYALA LUIS ALBERTO CC63000000 03N1N68001 300004542630.08000000036400000000000 000454263 000908526",
"00000022CC63000000 MURILLO ESCALANTE KELLY JOHANA 08N1N68001 300009085260.08000000072700000000000 000908526 000908526"
)), .Names = "X1", row.names = c(NA, -3L), class = c("tbl_df",
"tbl", "data.frame"))发布于 2021-05-12 17:41:40
你可以使用sub甚至gsub
df$X2 <- sub("^(.{366}).{9}$", "\\1", df$X1, perl = TRUE)
nchar(df$X2)
[1] 427 366 366使用此代码,第一行保持为427个字符,而其余的则减少到366。
发布于 2021-05-12 17:27:57
我们可以在nchar上使用min和substr
library(dplyr)
out <- df %>%
mutate(X1 = substr(X1, 1, min(nchar(X1))))如果我们需要更改剩下的行,保持第一行不变
out <- df %>%
mutate(X1 = replace(X1, -1, substr(X1[-1], 1, 367)))
nchar(out$X1)
#[1] 427 367 367注意:substr应该是最快的选项
或者使用base R
df$X1 <- substr(df$X1, 1, min(nchar(df$X1)))发布于 2021-05-12 18:00:26
这也是要添加到已经很棒的解决方案中的另一个解决方案:
library(dplyr)
library(stringr)
DT %>%
mutate(X1 = ifelse(nchar(X1) != 427, str_sub(X1, 1L, 367L), X1)) %>%
mutate(nc = nchar(X1)) %>%
select(nc)
# A tibble: 3 x 1
nc
<int>
1 427
2 367
3 367最后两行代码用于测试,因此可以省略。
https://stackoverflow.com/questions/67508360
复制相似问题