2013-09-28 6 views
1

Я предполагаю, что я просто этого не вижу, но все, что я нашел в Сети, в архивах Mailinglist или в FAQ, не могло действительно объяснить мою проблему.apply-strsplit-rowwise, включая сортировку и вложенную пасту

Ближайший я обнаружил, это: apply strsplit rowwise

У меня есть Д.Ф., с двумя столбцами символов и один числовой столбец. Заполненный как это:

df=data.frame(name1=c("A","B","C","D"), 
      name2=c("B","A","D","C"), 
      nums=c(1,1,4,4), 
      stringsAsFactors=F) 

Теперь я хотел бы найти уникальные строки в этом, однако, только на основе двух столбцов имен. И для этих столбцов порядок столбцов не имеет значения, поэтому я не могу использовать duplicated, если бы я понял его правильно.

Итак, я подумал о том, чтобы объединить два столбца столбцов по имени, сделать сортировку ролей и распечатать вектор paste (длина = 2 в сочетании с чем-то вроде sapply).

Однако я не получил его на работу.

До сих пор я использовал цикл for, но это требует времени на исходные данные.

for(i in 1:length(df$name1)){ 
      mysort=sort(c(df$name1[i],df$name2[i])) 
      df$combname[i]=paste(mysort[1],mysort[2]) 
    } 

Любые предложения приветствуются. Возможно, я просто понимаю unique и sapply неправильным образом.

ответ

1

Решение без цикла.

df$combname <- apply(df[1:2], 1, function(x) paste(sort(x), collapse="")) 
1

Возможно, вам стоит изучить пакет data.table. Вот один из подходов:

library(data.table) 
DT <- data.table(df) 
DT[, new := paste(sort(c(name1, name2)), collapse = ""), by = 1:nrow(DT)] 
DT 
# name1 name2 nums new 
# 1:  A  B 1 AB 
# 2:  B  A 1 AB 
# 3:  C  D 4 CD 
# 4:  D  C 4 CD 
DT[!duplicated(new), ] 
# name1 name2 nums new 
# 1:  A  B 1 AB 
# 2:  C  D 4 CD