根据条件在行名称中附加字符

时间:2017-02-05 15:41:25

标签: r rowname

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

W = 50  
Z = 100   

a <- sample(2:5,Z/2,replace=TRUE)
b <- 1/sample(8:32,Z,replace=TRUE)
c <- sample(1:8,W/2,replace=TRUE)/4
d <- 1/sample(40:48,W,replace=TRUE)

  Z[n] = Z[n-1] + a*Z[n-1] - b*Z[n-1]-18*W[n-1]
  W[n] = W[n-1] + c*W[n-1]- d*W[n-1]

这就是我想要的,一个&#39; c&#39;松树和红木旁边:

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"

3 个答案:

答案 0 :(得分:1)

trees$char是一个向量(1维)。所以不需要[,]。这不值得回答,但在评论中很难提及,只是发布了。

喂! bdw我现在意识到,另一点需要提及的是,在您的代码中,您没有将其分配回原始data.frame树,而是分配给子集data.frame权限,以便不会反映

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

答案 1 :(得分:1)

一个选项是

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

答案 2 :(得分:0)

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

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