Есть ли в R функция, которая позволяет выбирать строки, в которых имя строки заканчивается строчной буквой, и удалять эту букву? - PullRequest
3 голосов
/ 04 апреля 2019

У меня есть следующее data.frame:

data <- as.data.frame(seq(1:5))
rownames(data) <- c("abc-2A","abc-2b", "def-3", "ACD4.54Y", "ghj-5c")
data
             seq(1:5)
abc-2A          1
abc-2b          2
def-3           3
ACD4.54Y        4
ghj-5c          5

Я хотел бы сделать две вещи с этим фреймом данных:

  1. Сделать подмножество этих данныхфрейм, содержащий только те строки, в которых имя строки заканчивается строчной буквой.Это будет:

             seq(1:5)
    abc-2b          2
    ghj-5c          5
    
  2. Удалите эту строчную букву из имен строк в оригинале data.frame.Окончательный data.frame будет выглядеть следующим образом:

         seq(1:5)
    abc-2A          1
    abc-2           2
    def-3           3
    ACD4.54Y        4
    ghj-5           5
    

Я провел довольно много времени в переполнении стека и в Google, но я не мог понять, как это сделать.У кого-нибудь есть предложения?

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

Ответы [ 3 ]

4 голосов
/ 04 апреля 2019

Вы можете использовать функцию dplyr::filter для фильтрации строк по некоторым критериям.Строчные буквы в конце строки могут быть идентифицированы с помощью регулярных выражений, подобных этому [a-z]$.Объединение всего этого приводит к следующему

library(dplyr)
  mydata <- data.frame(id = c("select thiss", "DONT SELECT"), x = 1:2) 

mydata %>% 
    filter(grepl("[a-z]$", id)) %>% 
    mutate(id = sub("[a-z]$", "", id))

           id x
1 select this 1
3 голосов
/ 04 апреля 2019

Rownames во фрейме данных - это в основном вектор такой же длины, что и столбцы фрейма данных, с дополнительными требованиями, чтобы он (как правило) был наиболее уникальным, и он должен быть символьным вектором.

Проще всего начать с добавления его в качестве дополнительного столбца:

data$whatever <- rownames(data)

Теперь вы можете легко выполнять все свои обычные операции с этим столбцом.

Чтобы найти элемент, последний символ которогострочная буква, у вас есть:

grepl("[a-z]$", x)

, где x - интересующий вектор.Чтобы удалить (т.е. заменить оскорбляющий символ на ""), используйте sub:

sub("[a-z]$", "", x)

Сложите это вместе и что вы получите:

rownames(data) <- sub("[a-z]$", "", rownames(data))

Разница между sub и gsub заключается в том, что sub выполняет только 1 замену для каждого элемента, тогда как gsub выполняет несколько.

2 голосов
/ 04 апреля 2019

Для выбора строк, заканчивающихся строчными буквами (из @Rui Barradas)

data[grep("[a-z]$", rownames(data)),, drop = FALSE]

#       seq(1:5)
#abc-2b        2
#ghj-5c        5

Для изменения имен строк с использованием базы R sub

rownames(data) <- sub("(.*)[a-z]$", "\\1", rownames(data))

data
#         seq(1:5)
#abc-2A          1
#abc-2           2
#def-3           3
#ACD4.54Y        4
#ghj-5           5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...