Saya memiliki elemen daftar berikut. Ini berisi teks mentah dan kolom didasarkan pada panjang karakter. Baris pertama selalu memiliki lebar 427 karakter. sisa baris lebarnya 375 karakter.

Saya perlu menghapus 9 karakter terakhir dari masing-masing baris dengan lebar 375 karakter. itu akan menjadi posisi pembawa 367 hingga 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"))
r
1
Andres Mora 12 Mei 2021, 20:26

3 jawaban

Jawaban Terbaik

Anda dapat menggunakan sub atau bahkan gsub:

df$X2 <- sub("^(.{366}).{9}$", "\\1", df$X1, perl = TRUE)
nchar(df$X2)
[1] 427 366 366

Dengan kode ini, baris pertama dipertahankan pada 427 karakter sementara sisanya dikurangi menjadi 366

2
Onyambu 12 Mei 2021, 17:41

Ini juga merupakan solusi lain untuk ditambahkan ke solusi yang sudah bagus:

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

Dua baris kode terakhir adalah untuk tujuan yang diuji dan oleh karena itu dapat dihilangkan.

2
Anoushiravan R 12 Mei 2021, 18:00

Kita dapat menggunakan nchar dengan min pada substr

library(dplyr)
out <-  df %>%
   mutate(X1 = substr(X1, 1, min(nchar(X1))))

Jika kita perlu mengubah sisa baris dengan menjaga agar baris pertama tetap sama

out <- df %>%
        mutate(X1 = replace(X1, -1, substr(X1[-1], 1, 367)))


nchar(out$X1)
#[1] 427 367 367

CATATAN: substr harus menjadi opsi tercepat


Atau menggunakan base R

df$X1 <- substr(df$X1, 1, min(nchar(df$X1)))
2
akrun 12 Mei 2021, 17:44