如何在 R 中获取一个字符串的前 n 个字符。

4
我愿意为每行中的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的建议?
4个回答

5
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包 (v2.0.1)创建于2022-03-26。


3
您可以使用 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

2

使用 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})"替换提取正则表达式。

1

base R 中,我们可以使用 sub 函数-捕获 ((...)) 字符串开头的前三个非空格字符 (\\S), 然后是零或多个非空白字符和一个空格 (\\S*\\s),再捕获第二组三个非空白字符。在替换中,指定被捕获组的反向引用 (\\1,\\2) 并在它们之间插入下划线 (_)。

df$name <- sub("^(\\S{3})\\S*\\s(\\S{3}).*", "\\1_\\2", df$name)
df$name
[1] "Jam_Bon" "Mar_Tay" "Mic_Bal"

1
谢谢@akrun....很久不问你了:D - Anh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接