извлечь первые два символа из списка имен в r - PullRequest
1 голос
/ 04 февраля 2020

Фрейм данных df1 содержит два столбца: id и list_names

id <- seq(1,5)
list_names <- c("john", 
                "adam, sally", 
                "rebecca", 
                "zhang, mike, antonio", 
                "mark, henry, scott, john, steve, jason, nancy")

df1 <- data.frame(id, list_names)

Мне нужно добавить дополнительный столбец, содержащий первые два символа, извлеченные из каждого имени.

Новые данные set будет выглядеть так:

enter image description here

Обратите внимание, что количество имен в каждой строке указывать необязательно, так как это может быть что угодно.

Ответы [ 2 ]

3 голосов
/ 04 февраля 2020

Мы можем использовать str_extract_all для извлечения двух символов после границы слова

library(stringr)
library(dplyr)
library(purrr)
df1 %>%
     mutate(two_chars = str_extract_all(list_names, "\\b[a-z]{2}")  %>%
                            map_chr(toString))
#  id                                    list_names                  two_chars
#1  1                                          john                         jo
#2  2                                   adam, sally                     ad, sa
#3  3                                       rebecca                         re
#4  4                          zhang, mike, antonio                 zh, mi, an
#5  5 mark, henry, scott, john, steve, jason, nancy ma, he, sc, jo, st, ja, na

Или используя gsub

gsub("\\b([a-z]{2})[^,]+", "\\1", df1$list_names)
#[1] "jo"                         "ad, sa"                     "re"                         "zh, mi, an"                
#[5] "ma, he, sc, jo, st, ja, na"
2 голосов
/ 04 февраля 2020

В течение 1 oop разделите каждое наблюдение с помощью strsplit() на ', ', затем substr первых двух символов, а затем paste вместе:

for(g in df1$list_names){
  print(
   paste(substr(unlist(strsplit(g, ', ')),1,2), collapse = ', ')
  )
}

[1] "jo"
[1] "ad, sa"
[1] "re"
[1] "zh, mi, an"
[1] "ma, he, sc, jo, st, ja, na"

или вы можете одна строка это с sapply:

df1$new_list_names = sapply(df1$list_names, function(g) paste(substr(unlist(strsplit(as.character(g), ', ')),1,2), collapse = ', '))

> df1
  id                                    list_names             new_list_names
1  1                                          john                         jo
2  2                                   adam, sally                     ad, sa
3  3                                       rebecca                         re
4  4                          zhang, mike, antonio                 zh, mi, an
5  5 mark, henry, scott, john, steve, jason, nancy ma, he, sc, jo, st, ja, na
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...