2016-02-16 4 views
1

Я начинаю новичок, и, возможно, кто-то должен был просить об этом уже, но я не мог найти ответ.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» и так далее.

Я пробовал с strsplit и gsub отдельно, а затем вместе без успеха. Я не знаю, можно ли это сделать с помощью цикла или с чем-то вроде этой неудачной попытки.

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

Может ли кто-нибудь помочь мне ?. Благодарю.

ответ

1

Есть способы с sub и strsplit, но здесь просто и просто использовать 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) 
+0

Легче, чем я думал. –

+0

Я знаю об опасности использования чисел в качестве имени столбца, но мне нужно, чтобы он просто проверял мои данные. Я удалю имена позже для анализа кластеризации. –

0

Может быть, как это?

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

 Смежные вопросы

  • Нет связанных вопросов^_^