如何从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"
我想为 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"