Фильтровать Data.frame на основе Rownames - PullRequest
0 голосов
/ 25 февраля 2020
c <- data.frame("c1"=c(78,89,0),"c2"=c(89,89,34),"c3"=c(56,0,4))
row.names(c) <- c("zebra","fish","zucchini")


c <- rm(grep("z",rownames(c))) ??

надеюсь, короткий вопрос, короткий ответ: что не так с приведенным выше кодом? Он говорит, что «должен содержать имена или строки символов». Как удалить все строки, которые содержат z в своих именах строк. В этом репертуаре осталось только fi sh.

Большое спасибо

Ответы [ 3 ]

2 голосов
/ 25 февраля 2020

1) grepl Есть несколько проблем:

  • в тестовых данных в вопросе есть ошибки, поэтому мы используем тот, что в примечании в конце
  • хотя и не является строго неправильным, c не подходит для использования, учитывая повсеместное использование функции c в R, поэтому мы используем cc вместо
  • мы используем grepl с l в конце вместо grep, чтобы получить результат логического вектора, а затем использовать! чтобы отрицать это.
  • rm используется для удаления объектов из рабочей области, а не для удаления строк из фрейма данных, поэтому вместо этого мы используем индексы.

Пакеты не используются.

cc[!grepl("z", rownames(cc)), ]
##      c1 c2 c3
## fish 89 89  0

2) grep В качестве альтернативы можно также использовать grep с invert=TRUE аргумент:

cc[grep("z", rownames(cc), invert = TRUE), ]
##      c1 c2 c3
## fish 89 89  0

3) substr В этом примере символ z всегда отображается в качестве первого символа, поэтому в общем случае мы можем поочередно использовать:

cc[substr(rownames(cc), 1, 1) != "z", ]
##      c1 c2 c3
## fish 89 89  0

3a) начинается с Другой подход, если z должен быть первым символом:

cc[!startsWith(rownames(cc), "z"), ]
##      c1 c2 c3
## fish 89 89  0

Примечание

cc <- data.frame(c1 = c(78, 89, 0), c2 = c(89, 89, 34), c3 = c(56, 0, 4))
row.names(cc) <- c("zebra", "fish", "zucchini")
1 голос
/ 25 февраля 2020

Rm удаляет объекты. Вы пытаетесь фильтровать по строке.

c <- data.frame("c1"=c(78,89,0),"c2"=c(89,89,34),"c3"=c(56,0,4))
row.names(c) <- c("zebra","fish","zucchini")

print( c )
c[ !grepl("z",rownames(c)) , ] 
0 голосов
/ 25 февраля 2020

Ваш пример использует устаревшие свойства. Я несколько отредактировал его.

/ Edit: теперь я понимаю, что вы sh удалите эти строки, см. Следующий пример:

c <- tibble("c1"=c(78,89,0),"c2"=c(89,89,34),"c3"=c(56,0,4),
            "rownames"=c("zebra","fish","zucchini")) %>% 
  column_to_rownames("rownames")

c[!grepl("i", rownames(c)),] 

      c1 c2 c3
zebra 78 89 56

Также, как указано до этого c не должно быть именем объекта, так как оно также является центральной функцией в R.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...