【问题标题】:Appending Characters to Row Names Based on Condition根据条件将字符附加到行名
【发布时间】:2017-06-22 13:50:41
【问题描述】:

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

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

【问题讨论】:

    标签: r rowname


    【解决方案1】:

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

    嘿! bdw 我现在意识到,要提的另一点是,在您的代码中,您没有将其分配回原始的 data.frame 树,而是分配给子集的 data.frame 正确,因此不会被反映

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

    【讨论】:

    • @Danny 介意分享为什么这个答案是不可接受的。事实上我也先回答了这个问题。只是好奇
    • Joel,感谢您今天抽出时间回答我的问题;我应该早点发表评论。您确实指出我正在将我的名称更改应用于子集数据集,这确实很有帮助,但总的来说,我有大约 32,000 个不同的行名称,其中 'pine' 和 'redwood' 是。我不确定在 %in% 之后是否有更快的方法将它们组合在一起,或者您的代码是否需要手动将名称组合在一起。
    • @Danny 哦!!那是我的错误...我实际上已经编辑了我的答案以对 LHS 和 RHS 进行更改,但不知何故忘记将其更改为 RHS.. 仅供您参考编辑
    【解决方案2】:

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

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

    【讨论】:

    • 我喜欢这个解决方案,因为代码对我来说很清楚,但它现在已经在我的真实数据集上运行了 25 分钟。这是正常的吗?我应该提到,真实的数据框是 32105 个观测值,包含 657 个变量,但其中只有一个变量具有“锥形”(在其他三个因子水平中)。
    • 嗨,丹尼!我已经在这种大小的数据帧上使用了这样的 ifelse 来生成新列(尽管从来没有行名),而且它从来没有用过这么长的时间。所以我不确定这是否正常……但恐怕我没有解释!还在这里学习呢! :)
    【解决方案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])
    

    【讨论】:

    • 我选择了第二个选项。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2018-02-08
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 2022-10-13
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多