2016-07-14 4 views
3

У меня есть кадр данных с несколькими символьными переменными, я хочу найти уникальную строку в каждой строке. Существует только определенная строка, дублируемая в нескольких столбцах на строку, в окружении NA. И.Е. кадр данных «ДФ»:найти уникальные строки в переменных фрейма данных

Col1 Col2 Col3 
1 ABC ABC NA 
2 NA DEF DEF 
3 GHI NA NA 
4 JKL JKL JKL 

В качестве вывода я хотел бы иметь

ABC 
DEF 
GHI 
JKL 

Лучше всего было бы иметь какую-то применить функцию для каждой строки. Я опробовал несколько вариантов:

apply(df,1, function(x) unique(x)) 

Но это не удалось. Я думаю, что есть довольно простой способ, если вы знаете правильную функцию? Как я могу это сделать?

+1

Если в строке есть только один уникальный элемент (который может быть дублирован в этом или в строке или не), вы можете использовать 'df [cbind (1: nrow (df), max.col (! is.na (df)))]' без цикла –

ответ

3

Мы можем использовать is.na для удаления NA элементы

unname(apply(df, 1, FUN = function(x) unique(x[!is.na(x)]))) 
#[1] "ABC" "DEF" "GHI" "JKL" 

Если есть более чем один unique элемент для каждой строки, он возвращает в качестве list (в зависимости от того, различны для каждой строки число элементов). В этом случае мы можем paste их вместе, чтобы создать одну строку,

unname(apply(df, 1, FUN = function(x) toString(unique(x[!is.na(x)])))) 

Другой вариант pmax, если есть только один единственный элемент в строке

do.call(pmax, c(df, list(na.rm=TRUE))) 
#[1] "ABC" "DEF" "GHI" "JKL" 
+1

Спасибо, Akrun. Первый - мой предпочтительный метод. Как я и предполагал, я не был далеко от решения. Но мне не нужно было утомлять. – Rockbar

1

Другой вариант

levels(unlist(df)) 
+0

Я думаю, что это может завершиться неудачно, если несколько строк имеют одинаковые уникальные значения в том смысле, что они будут сообщаться только один раз (уровень), но не для каждой строки –

+0

@docendodiscimus: Определенно. Это решение, указанное в конкретной ситуации. Я думаю, что это самый простой способ в этой конкретной задаче достичь цели. – user2100721

 Смежные вопросы

  • Нет связанных вопросов^_^