Мой набор данных выглядит следующим образом

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

То, что я пытаюсь сделать, это взять первые два символа из первого слова в Кол1 и все целое второе слово, а затем объединить их.

Мой последний ожидаемый набор данных должен выглядеть следующим образом

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

Любые предложения о том, как этого добиться, очень ценятся.

1
Kim Jenkins 20 Авг 2018 в 18:55

6 ответов

Лучший ответ

Ты можешь сделать

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 соответствует границе слов.

2
kath 20 Авг 2018 в 16:09

Вы можете сделать это в несколько шагов. Сначала разделите пробелом, укажите первые две буквы имени и введите их заглавными буквами. Вставьте это вместе со второй частью. Результат в столбце 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
1
Roman Luštrik 20 Авг 2018 в 16:05

Вот еще один вариант с использованием sub. Мы можем использовать обходные пути в режиме Perl для выборочного удаления всего, кроме первых двух и двух последних символов. Затем сделайте вызов toupper(), чтобы использовать все буквы.

df$Col1 <- toupper(sub("(?<=^..).*(?=..$)", "", df$Col1), perl=TRUE)

[1] "MA7E" "FE2D" "AL4C"

Демо

1
Tim Biegeleisen 20 Авг 2018 в 16:06

Мы также можем сделать это в 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])))
1
divibisan 20 Авг 2018 в 16:06

А не решение одной строки это легко интерпретировать и изменить

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
1
Selcuk Akbas 20 Авг 2018 в 16:12

Для этого решения используйте 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"
0
milan 20 Авг 2018 в 16:56
51934432