r- 通过提取部分名称重命名多个列

r- Rename multiple columns by extracting part of the name

我是 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))) 

谁能帮帮我?谢谢

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)

大概是这样的?

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