2016-10-05 2 views
0

У меня есть кадр данных с 8 переменными, и мне нужно создать новый столбец, представляющий комбинацию из двух столбцов для использования в качестве идентификатора для каждого наблюдения , Две колонны, которые мне нужно объединить выглядеть следующим образом:Объедините первые две буквы каждого слова в строке предложения и числовой переменной

Aut <- c("Robert Lucas", "Finn Kydland & Edward Prescott", "Alan Blinder & Ben Bernanke", 
     "Lars Svensson & Lawrence Christiano & Robert Lucas", "Ben Bernanke") 
Year <- c(1976, 1989, 1983, 1985, 1983) 
df <- data.frame(Aut, Year) 

Результирующий ID переменной я ожидаю:

Aut         Year      ID 
Robert Lucas       1976     RoLu1976 
Finn Kydland & Edward Prescott  1989     FiKyEdPr1989 
Lars Svensson & Lawrence Christiano 1983    LaSvLaChRoLu1983 
& Robert Lucas 
Alan Blinder & Ben Bernanke   1985     AlBlBeBe1985 
Ben Bernanke       1983     BeBe1983 

ответ

2

Вы можете попробовать:

library(stringr) 
# first split the individual names using "&" as pattern. 
a <- str_split(df$Aut, "&") 
# Then use lapply, split and sub to split first and last name. Then paste the 
# first two letters of each name together. 
a1 <- lapply(a, function(x){ 
    x1 <- str_split(str_trim(x), " ") 
    paste0(unlist(lapply(x1, str_sub,1,2)), collapse="") 
}) 
# Finally add the years. Resulting vector can be saved in df. 
df$ID <- paste0(unlist(a1), df$Year) 

И все вместе в одном функции:

foo <- function(a, b){ 
    a <- str_split(a, "&") 
    a1 <- lapply(a, function(x){ 
      x1 <- str_split(str_trim(x), " ") 
      paste0(unlist(lapply(x1, str_sub, 1, 2)), collapse="") 
      }) 
    paste0(unlist(a1), b) 
} 

foo(df$Aut, df$Year) 
[1] "RoLu1976"   "FiKyEdPr1989"  "AlBlBeBe1983"  "LaSvLaChRoLu1985" "BeBe1983" 
2

An Другая идея:

library(stringi) 
lst <- sapply(stri_extract_all_words(df$Aut), function(x) substr(x, 0, 2)) 
df$ID <- paste0(sapply(lst, function(x) paste(x, collapse = '')), df$Year) 

Что дает:

#             Aut Year    ID 
#1          Robert Lucas 1976   RoLu1976 
#2      Finn Kydland & Edward Prescott 1989  FiKyEdPr1989 
#3      Alan Blinder & Ben Bernanke 1983  AlBlBeBe1983 
#4 Lars Svensson & Lawrence Christiano & Robert Lucas 1985 LaSvLaChRoLu1985 
#5          Ben Bernanke 1983   BeBe1983 
0

Вот base R вариант с gsub и paste

df$ID <- with(df, paste0(gsub("(([A-Za-z]{2})[a-z& ]*)", "\\2", Aut), Year)) 
df$ID 
#[1] "RoLu1976"   "FiKyEdPr1989"  "AlBlBeBe1983" 
#[4] "LaSvLaChRoLu1985" "BeBe1983"  
Смежные вопросы