【问题标题】:r- Rename multiple columns by extracting part of the namer- 通过提取部分名称来重命名多个列
【发布时间】:2016-02-16 22:31:19
【问题描述】:

我是 R 初学者,也许有人应该已经问过这个问题,但我找不到答案。

我的数据是这样的。

id_lance <-c("300_09_11", "400_09_11", "400_09_11", "400_09_11", "500_06_08",
          "500_06_08", "500_09_11", "600_06_08" , "700_09_11", "700_09_11")

especie <-c("esp1", "esp1", "esp1", "esp2", "esp2", "esp3", "esp2", "esp3",
        "esp3", "esp4")

abundancia <-as.numeric (c("190", "267","76", "111", "34", "334", "777", "1067",
                       "19", "255"))

df = data.frame(id_lance, especie, abundancia)

matriz <-as.data.frame(tapply(df$abundancia,list(df$especie,
                                            df$id_lance),sum))

matriz[] <- lapply(matriz,function(x) replace(x, is.na(x), 0))

我想通过提取前 3 个数字来重命名列名,即“300_09_11”到“300”等等。

我一直在尝试分别使用strsplitgsub,然后再一起尝试,但没有成功。我不知道是否可以通过循环或类似的失败尝试来完成。

names(matriz) <- gsub(strsplit(names(matriz), "_"),
                  paste0(substr(names(matriz)[[1]], 1, 3), names(matriz))) 

谁能帮帮我?谢谢。

【问题讨论】:

    标签: r gsub strsplit


    【解决方案1】:

    substrsplit 有很多方法,但在这里使用substr 很简单直接。我还会警告说,用数字命名列会在以后自找麻烦:

    names(matriz) <- substr(names(matriz), 1, 3)
    matriz
    #      300 400 500 500  600 700
    # esp1 190 343   0   0    0   0
    # esp2   0 111  34 777    0   0
    # esp3   0   0 334   0 1067  19
    # esp4   0   0   0   0    0 255
    

    更多base R 学习选项:

    #with sub()
    names(matriz) <- sub("_.*", "", names(matriz))
    
    #with strsplit()
    names(matriz) <- sapply(strsplit(names(matriz), "_"), '[', 1)
    

    【讨论】:

    • 比我想象的要容易。
    • 我知道使用数字作为列名的危险,但我需要这样做只是为了检查我的数据。稍后我将删除名称以进行聚类分析。
    • sapply(strsplit(names(matriz), "_"), '[', 1) 中的'[', 1 是什么意思?我正在尝试调整这个 sn-p 以供我自己使用,但我很难弄清楚。
    • @CelineDion 检查letters[1] 如何给出"a" 作为答案。那就试试'['(letters, 1)
    • 括号“[”是一个特殊的函数,不需要像大多数函数那样典型的括号。但是 R 中的每个函数都可以用function(arg1, ...) 格式编写。试试'+'(5,4)
    【解决方案2】:

    可能是这样的?

    library(stringr)
    names(matriz) = str_sub(names(matriz),0,3)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-12
      • 2014-01-26
      • 2017-04-01
      • 2018-06-12
      • 1970-01-01
      • 2016-07-24
      • 2021-05-11
      • 2021-11-27
      相关资源
      最近更新 更多