2015-08-06 1 views
1

У меня есть набор данных, который состоит из идентификаторов образцов и соответствующей переменной результата. Однако в моем наборе данных есть несколько повторяющихся идентификаторов проб. То, что я хотел бы сделать, это идентифицировать дубликат идентификатора образца и перекодировать этот идентификатор образца как уникальное имя, а затем перекодировать переменную результата как отсутствующую. Я знаю, что было бы проще просто удалить всю строку, но мне нужно поддерживать количество строк.Дублировать идентификаторы/результаты повторного набора и перекодировать как уникальные и отсутствующие с помощью R

Так у меня есть набор данных, как это:

dt<- data.frame(ID=c("A", "B", "A", "C"), Outcome=c("1", "1", "1", "1")) 

И я хотел бы перекодировать так это выглядит следующим образом:

dt1<- data.frame(ID=c("A", "B", "A.1", "C"), Outcome=c("1", "1", "-9", "1")) 

Спасибо!

+0

Что вы считали или пытались, и в чем проблема? – J0e3gan

ответ

3

Столбцы данных были factor класс. Я бы использовал stringsAsFactors=FALSE в вызове data.frame для создания нечисловых столбцов с символом класса. Причина в том, что если мы собираемся изменить некоторые значения/заменить некоторые уровни в классе «фактор», нам нужно иметь это новое «значение» как один из «уровней» этого «фактора». Поэтому, чтобы избежать этого, я конвертирую столбцы уже «factor» в «character». В этом примере оба столбца являются «фактором». Поэтому мы перебираем столбцы 'dt' с lapply и меняем столбцы на 'character' (as.character).

dt[] <- lapply(dt, as.character) 

Я думаю, что ОП хочет иметь unique элементы в столбце «ID», заменив идентификаторы duplicate. Один из вариантов: make.unique.

dt$ID <- make.unique(dt$ID) 

После того как мы преобразовать «ID» в unique идентификаторы, мы можем проверить . в этой колонке и заменить соответствующие элементы в столбце «результат» от -9.

dt$Outcome[grep('[.]', dt$ID)] <- -9 
dt 
# ID Outcome 
#1 A  1 
#2 B  1 
#3 A.1  -9 
#4 C  1 

Или, как @ A.Webb упоминается в комментариях, мы можем использовать duplicated с ifelse для изменения значений столбцов «результат».

transform(dt, 
     ID=make.unique(as.character(ID)), #change the ID column 
     Outcome=ifelse(duplicated(ID),-9, ​Outcome)) #change Outcome 
+1

'grep' опасен, если у вас уже есть законные точки в некоторых именах. Вместо этого используйте «дублированный» чек на оригинале. 'transform (dt, ID = make.unique (as.character (ID)), Результат = ifelse (дублированный (ID), - 9, Результат))' –

+0

@ A.Webb Спасибо за комментарии. Это полезно – akrun

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