2013-02-20 5 views
0

У меня есть данные полного имени, которые я использовал strsplit() для получения каждого элемента имени.нужно использовать список сглаживания для использования в R

# Dataframe with a `names` column (complete names) 
df <- data.frame(
    names = 
      c("Adam, R, Goldberg, MALS, MBA", 
      "Adam, R, Goldberg, MEd", 
      "Adam, S, Metsch, MBA", 
      "Alan, Haas, MSW", 
      "Alexandra, Dumas, Rhodes, MA", 
      "Alexandra, Ruttenberg, PhD, MBA"), 
    stringsAsFactors=FALSE) 

# Add a column with the split names (it is actually a list) 
df$splitnames <- strsplit(df$names, ', ') 

У меня также есть список градусов ниже

degrees<-c("EdS","DEd","MEd","JD","MS","MA","PhD","MSPH","MSW","MSSA","MBA", 
      "MALS","Esq","MSEd","MFA","MPA","EdM","BSEd") 

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

Я не уверен, как сгладить список имен, чтобы я мог сравнить два вектора, используя intersect. Когда я попробовал unlist(df$splitname,recursive=F), он возвращал каждый элемент отдельно. Любая помощь приветствуется.

+0

'lapply (df $ splitname, intersection, degrees)'? – mnel

+0

@agstudy, да. untested (и, следовательно, typo) – mnel

ответ

3

Попробуйте

df$intersect <- lapply(X=df$splitname, FUN=intersect, y=degrees) 

Это даст вам список пересечения каждого элемента в df$splitname (напримерintersect(df$splitname[[1]], degrees)). Если вы хотите как вектор:

sapply(X=df$intersect, FUN=paste, collapse=', ') 

Я предполагаю, что вам это нужно как вектор, так как, возможно, полные имена пришли из одного (например, из dataframe), но strsplit выводит список.

Это работает? Если нет, попробуйте уточнить свое намерение.

Удачи вам!

+0

'unlist (df $ intersect)' не будет иметь предполагаемых последствий, поскольку каждое имя может содержать один или несколько градусов. Я исправил это в сообщении. –

+0

Спасибо большое! Я думал об этом неправильно. Добавленный намек на то, чтобы сделать его вектором, тоже помогает. – user1495088

0

Для непрерывности, вы можете использовать unlist:

hh <- unlist(df$splitname) 
intersect(hh,degrees) 

Например:

ll <- list(c("Adam" , "R" , "Goldberg" ,"MALS" , "MBA "), 
      c("Adam" , "R" , "Goldberg", "MEd")) 

intersect(hh,degrees) 
[1] "MEd" 

или эквивалент:

hh[hh %in% degrees] 
[1] "MEd" 

Чтобы получить разницу вы можете использовать

setdiff(hh,degrees) 
[1] "Adam"  "R"  "Goldberg" "MALS"  "MBA "  

...

+0

Поскольку проблема, по-видимому, определяет степень от каждого имени, ответы должны быть назначены на одни и те же записи (* т.е. * степени, связанные с исходным именем), поэтому список действительно не является вариантом, поскольку любое имя может иметь более одной степени (на самом деле, это происходит в данных примера). –