【问题标题】:Split a string using strsplit and make a new vector of one part of the split使用 strsplit 拆分字符串并为拆分的一部分创建一个新向量
【发布时间】:2014-05-17 14:56:42
【问题描述】:

我有一个矩阵,其列名都是“BT549-[数字]”,所以 BT549-0、BT549-1 等。我正在尝试删除 BT549- 前缀并只保留数字。到目前为止,在连字符上拆分名称效果很好,但事实证明删除字符串更加困难。例如,如果矩阵被命名为 dset,

a <- strsplit(colnames(dset), "-")
b <- unlist(a)

head(b)
[1] "BT549" "0"     "BT549" "10"    "BT549" "11" 

我尝试使用 for 循环拆分字符串并保留每个字符串的第二个索引:

a <- for(i in colnames(dset)) {
       unlist(strsplit(colnames(dset[i]), split='-', fixed=TRUE))[2]
     }
# Error in strsplit(colnames(dset[i]), split = "-", fixed = TRUE) : 
#   non-character argument

但我不明白这个错误。我怀疑有一种简单的方法可以做到这一点,我只是没有想到。非常感谢任何和所有建议。 谢谢。

【问题讨论】:

    标签: r split strsplit


    【解决方案1】:

    如果您的唯一目标是删除“BT549-”,我的解决方案应该可以工作,并且不会利用strsplit,而是更容易利用stringr::str_replace_all

    library(stringr)
    
    colnames(dset) <- str_replace_all(colnames(dset), "BT549-", "")
    

    【讨论】:

    • 超级简单,正如我所怀疑的那样。 :-) 谢谢!
    【解决方案2】:

    您不能将for 的结果分配给这样的变量。您可以提取b 的每一秒元素:

    colnames(dset)<-b[c(FALSE,TRUE)]
    

    你也可以只提取a的每个元素的第二个元素:

    colnames(dset)<-sapply(a,function(x) a[2])
    

    或者,更简洁:

    colnames(dset)<-sapply(a,`[`,2)
    

    您甚至可以在base 中使用sub

    colnames(dset)<-sub('^BT549-','',colnames(dset))
    

    【讨论】:

    • 在您的第三个示例中:为什么使用反引号 ` ` 而不是引号 ' ' ?据我所知,两者都可以工作。
    • @andrasz 两者都有效。 sapply 将接受命名函数的字符串或函数本身作为其第二个参数。 [ 计算为一个函数,而“[”计算为一个字符。
    猜你喜欢
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多