rr-rownames

Appending Characters to Row Names Based on Condition


I have a large data frame where I would like to append characters to row names based on a condition. I have the following example:

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

This is what I'm going for, a 'c' next to pine and redwood:

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

I know I can use paste to append characters:

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

[1] "pine c"    "redwood c"

However, when I try this following line of code, the changes don't appear in my data frame:

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

Solution

  • One option is

    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
    

    Another option is

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