2016-10-07 7 views
0

У меня есть фрейм данных, и мне нужно очистить его в соответствии с двумя значениями, которые являются «квази-идентичными» в строках. Мне нужно только удалить наблюдения, которые отличаются, но не идентичны. Я пытаюсь сделать это, используя agrep, но эта функция также удаляет одинаковые наблюдения.Условные строки удаления: удалять квазиоднозначные строки, но не идентичные

Id<-c("RoLu1976","Rolu1976","RoLu1976","AlBl1989","ThSa1996") 
Art<-c("Econometric Policy Evaluation: A Critique","Econometric Policy Evaluations A Critique","Econometric Policy Evaluation: A Critique", "Rules after discretion", "Expectations and the Nonneutrality of Lucas") 
Id.1<-c("FiKy1989","FiKy1989","BeBe1983","JoSt1989","JoSt1990") 
Art.1<-c("Notes on the Lucas Critique","Notes on the Lucas Critique","The Inconsistency of Optimal Plans","The Inconsistency","Notes on the Lucas") 
N<-data.frame(Id,Art,Id.1,Art.1) 

Квази одинаковые значения в указанном выше dataframe в Art колонке на двух первых наблюдений, которые отличаются только для s и :.

В приведенном выше случае окончательный кадр данных должен быть (обратите внимание, что одинаковые значения не удалять):

Id  Art           Id.1  Art.1 
RoLu1976 Econometric Policy Evaluation: A Critique FiKy1989 Notes on the Lucas Critique 
RoLu1976 Econometric Policy Evaluation: A Critique BeBe1983 The Inconsistency of Optimal Plans 
AlBl1989 Rules after discretion      JoSt1989 The Inconsistency 
ThSa1996 Expectations and the Nonneutrality of Lucas JoSt1990 Notes on the Lucas 

Что я сделал this:

yy = NULL 
for(i in 1:length(N$Art)){ 
    temp = agrep(N[i,"Art"],N$Art,value=T) 
    y = ifelse(any(N[i,"Art"]==temp),temp[1],N[i,"Art"]) 
    yy = c(yy,y) 
} 
N$Art = yy 
N.2 = N[!duplicated(N$Art), ] 

Но удалить как значения: идентичны и квазиподобны.

Как я могу это сделать?

+0

Вы действительно уверены, что хотите добавить критерии в колонку "Искусство"? Предположим, что вторая строка вашего оригинала 'N' имела« Art.1 », например. «Foobar» (т.е. отличается от «Art.1» любого из других «дубликатов»). Вы все еще хотите его бросить? –

+0

@ Mathematical.coffee Было бы два критерия: колонка «Искусство» quiasi-идентична, но идентична в «Art.1» (или любой другой колонке) и удаляет все квази-идентичные значения в «Art» (не идентичные), но идентичны в «Art1». – Dan

ответ

3

Вы можете хранить индексы вещей, которые идентичны в исходном столбце Art, и использовать их в сочетании с результатами после устранения дублирования, например.

originallyDuplicated <- duplicated(N$Art) 
# then run your snippet to generate `yy` 

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

N[!(duplicated(yy) & !originallyDuplicated),] 

Хотя мне кажется, что вместо того, основывая свои критерии исключения исключительно на Art колонке, было бы больше смысла, чтобы исключить строку, если каждый столбец в строке дублируется (или почти дублируется) в другом месте в таблице. (например, сравнить также в колонке Art.1, Id.1, ID etc?)

+0

Возможно, это будет ошибкой, если у вас есть несколько одинаковых опечаток в 'N' (например, вы сказали, что у вас есть две оценки эконометрической политики) - потому что как вы (R) знаете, какой из них является« дубликатом », а какой является «оригиналом»? –

+0

Либо может служить «оригиналом», проблема в том, что - хотя оба они «разные» - в других столбцах одинаковы, что означает, что значение подсчитывается дважды. – Dan

+0

@ Mathematical.cofee Вы правы. Когда кадр данных имеет несколько значений, которые «квази идентичны», он удаляет только одно из квази одинаковых значений, а остальные значения просто изменяются в исходную форму. – Dan

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

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