Добавление символов к именам строк на основе условия

У меня есть большой фрейм данных, где я хотел бы добавить символы к именам строк на основе условия. У меня есть следующий пример:

trees <- data.frame(char = c('flower', 'cone', 'flower', 'cone'), number = c(3, 3, 5, 6))
rownames(trees) <- c('birch', 'pine', 'maple', 'redwood')

Вот к чему я иду, "с" рядом с сосной и красным деревом:

           char    number
birch      flower  3
pine c     cone    3
maple      flower  5
redwood c  cone    6

Я знаю, что могу использовать вставить для добавления символов:

# this gives the output I am looking for
paste(rownames(trees[trees$char == 'cone',]), 'c')

[1] "pine c"    "redwood c"

Однако, когда я пытаюсь выполнить следующую строку кода, изменения не отображаются в моем фрейме данных:

rownames(trees[trees$char == 'cone',]) <- paste(rownames(trees[trees$char == 'cone',]), 'c')

3 ответа

Решение

Один вариант

library(stringr)
x1 <- str_extract(trees$char, "^c")
row.names(trees) <- trimws(paste(row.names(trees), replace(x1, is.na(x1), "")))
trees
#            char number
#birch     flower      3
#pine c      cone      3
#maple     flower      5
#redwood c   cone      6

Другой вариант

row.names(trees) <- paste(row.names(trees), c("", "c")[(trees$char == "cone")+1])

trees$char является вектором ( 1-мерным). Так что не нужно [,], Это не стоит ответа, но трудно упомянуть в комментарии, поэтому просто опубликовал.

Привет! bdw я понял теперь, еще один момент, который стоит упомянуть, это то, что в вашем коде вы не назначаете его обратно оригиналу data.frame деревья, но в подмножество data.frame прямо так, что не отражается

rownames(trees)[trees$char == "cone"] <- paste(rownames(trees)[trees$char == "cone"], "c")

Вы можете использовать функцию ifelse для определения имен строк: если значение символа равно "конусу", вставьте "c" в конец текущего имени строки, иначе используйте существующее имя строки.

rownames(trees) <- ifelse(trees$char=="cone",paste(rownames(trees), 'c'),rownames(trees))
Другие вопросы по тегам