2013-06-09 5 views
0

У меня есть следующие данныеКак удалить повторяющиеся строки в R

x y z 

1 2 a 

1 2 

данных [2,3] является фактором, но ничего не показывает, В данных, она имеет много строк, как таким образом. Как удалить строку, когда z ничего не имеет? Я имею в виду удаление строк, таких как вторая строка.

вывод должен быть

x y z 

1 2 a 
+4

Можете ли вы опубликовать вывод 'dput (головка (yourdataframe))', чтобы сделать данные образцы легко копировать и вставлять. – A5C1D2H2I1M1N2O1R2T1

+0

вывод выше, пожалуйста, помогите! – Dryad

+1

возможно 'data [! data $ z == "",] ', но вы не опубликовали свои данные, как задал @AnandaMahto (вставка вывода из' dput (head (data))), поэтому мы не знаем. –

ответ

5

OK. Здесь немного вздремнуть.

Представьте себе следующий набор данных:

mydf <- data.frame(
    x = c(.11, .11, .33, .33, .11, .11), 
    y = c(.22, .22, .44, .44, .22, .44), 
    z = c("a", "", "", "f", "b", "")) 
mydf 
#  x y z 
# 1 0.11 0.22 a 
# 2 0.11 0.22 
# 3 0.33 0.44 
# 4 0.33 0.44 f 
# 5 0.11 0.22 b 
# 6 0.11 0.44 

Из комбинации заголовке и описании (ни один из которых, кажется, полностью описать вашу проблему), я бы расшифровать, что вы хотите отказаться от строки 2 и 3, но не строка 6. Другими словами, вы хотите сначала проверить, дублируется ли строка (предположительно, только первые два столбца), а затем, если третий столбец пуст, отбросьте эту строку. По этим инструкциям строка 5 должна оставаться (колонка «z» не является пустой), а строка 6 должна оставаться (комбинация столбцов 1 и 2 не является дубликатом).

Если это так, вот один подход:

# Copy the data.frame, "sorting" by column "z" 
mydf2 <- mydf[rev(order(mydf$z)), ] 
# Subset according to your conditions 
mydf2 <- mydf2[duplicated(mydf2[1:2]) & mydf2$z %in% "", ] 
mydf2 
#  x y z 
# 3 0.33 0.44 
# 2 0.11 0.22 

^^ Те данные, которые мы хотим удалить. Один из способов их удаления используется setdiff на rownames каждого набора данных:

mydf[setdiff(rownames(mydf), rownames(mydf2)), ] 
#  x y z 
# 1 0.11 0.22 a 
# 4 0.33 0.44 f 
# 5 0.11 0.22 b 
# 6 0.11 0.44 
+0

Спасибо! Это то, что я хочу – Dryad

+1

@Dryad, если это то, что вы ищете, подумайте о голосовании или принятии ответа. Кроме того, добро пожаловать в SO, но учтите, что для получения более качественных ответов - здесь много людей, которые больше чем рады помочь! - пожалуйста, уделите время правильному вопросу, который освещает все аспекты вашей проблемы , Кроме того, обязательно прочитайте [как сделать отличный воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). – A5C1D2H2I1M1N2O1R2T1

+1

+1 @AnandaMahto отлично догадаться! – agstudy

0

Некоторые примеры данных:

df = data.frame(x = runif(100), 
       y = runif(100), 
       z = sample(c(letters[0:10], ""), 100, replace = TRUE)) 

> head(df) 
      x   y z 
1 0.7664915 0.86087017 a 
2 0.8567483 0.83715022 d 
3 0.2819078 0.85004742 f 
4 0.8241173 0.43078311 h 
5 0.6433988 0.46291916 e 
6 0.4103120 0.07511076 

пятно строка шесть с отсутствующим значением. Вы можете Подмножество с использованием вектора из logical «с (TRUE, FALSE):

df[df$z != "",] 

И, как заметил @AnandaMahto, вы можете даже проверить против нескольких условий:

df[!df$z %in% c("", " "),] 
+0

Я мог бы поддержать, если вы удалите свою рекомендацию на '-which'. Кроме того, я все еще не убежден, что это охватывает возможную сложность (плохо представленного) вопроса. – A5C1D2H2I1M1N2O1R2T1

+0

Это мой второй раз задать вопрос здесь, поэтому я не понимаю dput (head (data))) – Dryad

+0

@Dryad Try '? dput'. – Thomas

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