Добавление символов к именам строк на основе условия
У меня есть большой фрейм данных, где я хотел бы добавить символы к именам строк на основе условия. У меня есть следующий пример:
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))