如何从R中的字符串中获取前n个字符

How to get first n characters from a string in R

我想为 df 中的每一行提取每个字符串的三个字母,如下所示

示例:

df <- data.frame(name = c('Jame Bond', "Maria Taylor", "Micheal Balack"))
df
            name
1      Jame Bond
2   Maria Taylor
3 Micheal Balack

欲出

df_new 
        name
1      Jam_Bon
2      Mar_Tay
3      Mic_Bal

对此使用 tidyverse 有任何建议吗?

您可以尝试使用 dplyr::rowwise()stringr::str_split()stringr::str_sub()

df_new <- df %>% 
  rowwise() %>% 
  mutate(name = paste(
    unlist(
      lapply(str_split(name, ' '), function(x){
        str_sub(x, 1, 3)
      })
    ), 
    collapse = "_"
  ))

我得到了与您预期相同的结果:

> df_new
# A tibble: 3 x 1
# Rowwise: 
  name   
  <chr>  
1 Jam_Bon
2 Mar_Tay
3 Mic_Bal
library(stringr)
library(dplyr)

df$name %>% 
  str_extract_all("(?<=(^|[:space:]))[:alpha:]{3}") %>% 
  map_chr(~ str_c(.x, collapse = "_"))

stringr 备忘单对于解决这些类型的问题非常有用。 https://www.rstudio.com/resources/cheatsheets/

reprex package (v2.0.1)

创建于 2022-03-26

另一种使用 tidyr 函数的方法:

df |> 
  extract(name, c("x1","x2"), "(\w{3}).*\s(\w{3})") |> 
  unite(col = "name",x1,x2, sep = "_")

给予:

     name
1 Jam_Bon
2 Mar_Tay
3 Mic_Bal

请注意,这假设所有名字和姓氏至少有 3 个字符,否则将提取的正则表达式替换为 "(\w{1,3}).*\s(\w{1,3})"

base R中,我们可以使用sub——捕获((...))开头的三个non-space(\S)个字符(^), 接着是零个或多个 non-white space 和一个白色的 space (\S*\s), 然后捕获第二组 3 个 non-white 字符.在替换中,指定捕获组的反向引用 (\1\2) 并在这些

之间插入下划线 (_)
df$name <- sub("^(\S{3})\S*\s(\S{3}).*", "\1_\2", df$name)
df$name
[1] "Jam_Bon" "Mar_Tay" "Mic_Bal"