Формула для замены имен столбцов датафрейма категориями, определенными во втором фрейме данных - PullRequest
0 голосов
/ 07 сентября 2018

Допустим, у меня есть данные в широком формате (образцы в строке и виды в столбцах).

species <- data.frame(
    Sample = 1:10, 
    Lobvar = c(21, 15, 12, 11, 32, 42, 54, 10, 1, 2), 
    Limtru = c(2, 5, 1, 0, 2, 22, 3, 0, 1, 2), 
    Pocele = c(3, 52, 11, 30, 22, 22, 23, 10, 21, 32), 
    Genmes = c(1, 0, 22, 1, 2,32, 2, 0, 1, 2)
)

И я хочу автоматически изменить названия видов на основе ссылки на функциональные группы, которые есть у меня для всех видов (так что это работает, даже если у меня больше ссылок, чем фактических видов в наборе данных), например:

reference <- data.frame(
    Species_name = c("Lobvar", "Ampmis", "Pocele", "Genmes", "Limtru", "Secgio", "Nasval", "Letgos", "Salnes", "Verbes"), 
    Functional_group = c("Crustose", "Geniculate", "Erect", "CCA", "CCA", "CCA", "Geniculate", "Turf","Turf", "Crustose"),
    stringsAsFactors = FALSE
)

EDIT

Благодаря предложениям @Dan Y теперь я могу изменить названия видов на названия их функциональных групп:

names(species)[2:ncol(species)] <- reference$Functional_group[match(names(species), reference$Species_name)][-1]

Однако в моем фактическом data.frame у меня больше видов, и это создает много функциональных групп с одинаковыми именами в разных столбцах. Теперь я хотел бы суммировать столбцы с одинаковыми именами. Я обновил пример, чтобы получить результаты, в которых имеется более одной функциональной группы с одинаковым именем.

Итак, я понял:

Sample Crustose CCA Erect CCA Crustose
      1       21   2     3   1        2
      2       15   5    52   0        3
      3       12   1    11  22        4
      4       11   0    30   1        1
      5       32   2    22   2        0
      6       42  22    22  32        0

и конечный результат, который я ищу, таков:

Sample Crustose CCA Erect
  1       23      3     3     
  2       18      5    52    
  3       16     22    11       
  4       12      1    30       
  5       32      4    22       
  6       42     54    22 

Как вы советуете приблизиться к этому? Спасибо за вашу помощь и удивительные предложения, которые я уже получил.

1 Ответ

0 голосов
/ 07 сентября 2018

Re Q1) Мы можем использовать match для поиска имени:

names(species)[2:ncol(species)] <- reference$Functional_group[match(names(species), reference$Species_name)][-1]

Re Q2) Тогда мы можем mapply функция rowSums после некоторого регулярного выражения, работающего с colnames:

namevec <- gsub("\\.[[:digit:]]", "", names(df))
mapply(function(x) rowSums(df[which(namevec == x)]), unique(namevec)) 
...