r字符串拆分和合并

时间:2018-08-20 15:55:12

标签: r string split

我的数据集如下所示

 Id       Col1
 --------------------
 133      Mary 7E
 281      Feliz 2D
 437      Albert 4C

我想做的是从Col1中第一个单词的第一个开始取两个字符,然后取整个第二个单词的全部,然后合并它们。

我最终的预期数据集如下所示

 Id       Col1
 --------------------
 133      MA7E
 281      FE2D
 437      AL4C

任何有关如何实现这一目标的建议都将受到赞赏。

6 个答案:

答案 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"

Demo

答案 3 :(得分:1)

我们还可以在paste0管道链中将substrstr_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"