R语言 根据条件向行名称追加字符

pw9qyyiw  于 2023-04-03  发布在  其他
关注(0)|答案(3)|浏览(281)

我有一个很大的数据框,我想根据条件将字符追加到行名称中。我有以下示例:

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

这就是我想要的,一个“c”旁边的松树和红木:

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')
mzillmmw

mzillmmw1#

trees$char是一个向量(1维)。所以不需要一个[,]。这是不值得一个答案,但很难在评论中提到,所以刚刚发布。
嘿!bdw我现在意识到,另一点要提到的是,在您的代码中,您没有将其分配回原始的data.frame树,而是将其分配给子集data.frame,这样就不会反映出来。

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

hl0ma9xz2#

一个选择是

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])
qltillow

qltillow3#

可以使用ifelse函数定义行名:如果char值为“cone”,则将“c”粘贴到当前行名的末尾,否则使用现有行名。

rownames(trees) <- ifelse(trees$char=="cone",paste(rownames(trees), 'c'),rownames(trees))

相关问题