Изменение имени строки возвращает «дубликаты ‘row.names’ недопустимы» в R

#r #row

#r #строка

Вопрос:

Я попытался изменить имена строк из formate с «data07_2470178_2» на «2470178» следующим кодом:

 rownames(df) <-regmatches(rownames(df), gregexpr("(?<=_)[[:alnum:]]{7}", rownames(df), perl = TRUE))
  

Но это возвращает следующую ошибку:

 Error in `.rowNamesDF<-`(x, value = value) : duplicate 'row.names' are not allowed
  

Набор данных вкратце выглядит так:

                     1  2   3  4
data143_2220020_1  24  87  3  32
data143_2220020_2  24  87  3  32
data105_2220058_1  26  91  3  36
data105_2220058_2  26  91  3  36
data134_2221056_2  13  40  3  17
data134_2221056_1  13  40  3  17
  

И я бы хотел, чтобы мой набор данных выглядел следующим образом. Для каждой исходной строки остается только та, которая заканчивается на «_2»:

           1  2   3  4
2220020  24  87  3  32
2220058  26  91  3  36
2221056  13  40  3  17
  

Я действительно не понимаю, почему это так? Кроме того, как я могу правильно изменить имя строки? Кто-нибудь может помочь? Заранее спасибо!

Комментарии:

1. Можете ли вы предоставить содержимое rownames(df) ? Также вы намерены заменить весь df data.frame? Или вы имели в виду, rownames(df)<-... а не df<-... ?

2. Как «data07_2470178_2» превращается в «2370178»? Вы имеете в виду «2470178» вместо этого? У вас не может быть повторяющихся имен строк в ваших данных, что означает, что это дало бы одно и то же имя строки, если у вас есть одна запись как «data07_2470178_2», а другая как «data07_2470178_3». Можете ли вы показать ожидаемый результат для вашего примера?

3. Извините, это должны быть rownames (df), и я повторно отредактировал вопросы. Я просто хочу переименовать имена строк df

Ответ №1:

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

 rn <- sub('.*_(\d )_.*', '\1', rownames(df))
df1 <- df[!duplicated(rn), ]
rownames(df1) <- unique(rn)
df1
#         1  2 3  4
#2220020 24 87 3 32
#2220058 26 91 3 36
#2221056 13 40 3 17
  

Однако unique(df) автоматически предоставит вам только уникальные строки, и вы можете изменить имена строк на основе вышеуказанного метода.

данные

 df <- structure(list(`1` = c(24L, 24L, 26L, 26L, 13L, 13L), `2` = c(87L, 
87L, 91L, 91L, 40L, 40L), `3` = c(3L, 3L, 3L, 3L, 3L, 3L), `4` = c(32L, 
32L, 36L, 36L, 17L, 17L)), class = "data.frame", 
row.names = c("data143_2220020_1", 
"data143_2220020_2", "data105_2220058_1", "data105_2220058_2", 
"data134_2221056_2", "data134_2221056_1"))
  

Комментарии:

1. Ну, это возвращает ошибку с: Ошибка в .rowNamesDF<- (x, value = значение): недопустимая длина ‘row.names’. Я предполагаю, что это вызвано разной длиной между df1 и unique (rn), поскольку все rn равны от 1 до n без повторяющегося значения, но df1 короче, так как df имеют повторяющееся значение.

2. Я не уверен в ошибке. Похоже, это работает для общего примера. Можете ли вы проверить данные, которые я добавил в свой пост? Если это все еще не работает, можете ли вы добавить свои данные с помощью dput ?