#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
?