我想為每一行提取每個字串的三個字母,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 對此有何建議?
uj5u.com熱心網友回復:
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 包于 2022-03-26 創建(v2.0.1)
uj5u.com熱心網友回復:
您可以嘗試使用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
uj5u.com熱心網友回復:
使用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})"
uj5u.com熱心網友回復:
在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"
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/450202.html
上一篇:在R中添加散點圖
下一篇:使用列名展開所有列
