我的数据集如下所示
Id Col1
--------------------
133 Mary 7E
281 Feliz 2D
437 Albert 4C
我想做的是从Col1中第一个单词的第一个开始取两个字符,然后取整个第二个单词的全部,然后合并它们。
我最终的预期数据集如下所示
Id Col1
--------------------
133 MA7E
281 FE2D
437 AL4C
任何有关如何实现这一目标的建议都将受到赞赏。
答案 0 :(得分:2)
您可以
my_data$Col1 <- sub("(\\w{2})(\\w* )(\\b\\w+\\b)", "\\1\\3", my_data$Col1)
my_data$Col1 <- toupper(my_data$Col1)
my_data
# Id Col1
# 1 133 MA7E
# 2 281 FE2D
# 3 437 AL4C
方括号显示匹配的单个组,仅保留第一个和第三个。 \\w
匹配字母和数字,\\b
匹配单词的边界。
答案 1 :(得分:1)
您可以分几个步骤进行操作。首先按空格分隔,将名称的前两个字母组成子集并大写。将其与第二部分一起粘贴。结果在final
列中。您可以采取所有这些中间步骤,也可以将命令链式化为更少的语句,而不管您的船身是什么。
xy <- data.frame(id = c(133, 281, 437),
name = c("Mary 7E", "Feliz 2D", "Albert 4C"),
stringsAsFactors = FALSE)
xy$first <- sapply(strsplit(xy$name, " "), "[", 1)
xy$second <- sapply(strsplit(xy$name, " "), "[", 2)
xy$first_upper <- toupper(substr(x = xy$first, start = 1, stop = 2))
xy$final <- paste(xy$first_upper, xy$second, sep = "")
xy
id name first second first_upper final
1 133 Mary 7E Mary 7E MA MA7E
2 281 Feliz 2D Feliz 2D FE FE2D
3 437 Albert 4C Albert 4C AL AL4C
答案 2 :(得分:1)
这是使用sub
的另一个变体。我们可以在Perl模式下使用环视功能来选择性地删除除前两个字符和后两个字符以外的所有内容。然后,致电toupper()
以大写所有字母。
df$Col1 <- toupper(sub("(?<=^..).*(?=..$)", "", df$Col1), perl=TRUE)
[1] "MA7E" "FE2D" "AL4C"
答案 3 :(得分:1)
我们还可以在paste0
管道链中将substr
和str_split
的输出一起在dplyr
中进行此操作:
df <- data.frame(id = c(133,281,437),
Col1 = c("Mary 7E", "Feliz 2D", "Albert 4C"))
library(stringr)
df %>%
mutate(Col1 = toupper(paste0(substr(Col1, 1, 2),
stringr::str_split(Col1, ' ')[[1]][-1])))
答案 4 :(得分:1)
它不是一排解决方案,而是易于解释和修改
xx_df <- data.frame(id = c(133,281,437),
Col1 = c("Mary 7E", "Feliz 2D", "Albert 4C"))
xx_df %>%
mutate(xpart1 = stri_split_fixed(Col1, " ", simplify = T)[,1]) %>%
mutate(xpart2 = stri_split_fixed(Col1, " ", simplify = T)[,2]) %>%
mutate(Col1_new = paste0(substr(xpart1,1,2), substr(xpart2, 1, 2))) %>%
select(id, Col1 = Col1_new) %>%
mutate(Col1 = toupper(Col1))
结果是
id Col1
1 133 MA7E
2 281 FE2D
3 437 AL4C
答案 5 :(得分:0)
对于此解决方案,请使用substr
从每个字符串中获取前2个元素,并获取最后2个元素。要选择后2个元素,我们需要nchar
作为sapply
的一部分。 paste0
在一起。还可以使用toupper
来使用大写字母。
l2 <- sapply(df$Col1, function(x) nchar(x))
paste0(toupper(substr(df$Col1,1,2)), substr(df$Col1, l2-1, l2))
[1] "MA7E" "FE2D" "AL4C"