Merge биологический массив и массив с этикетками

Я хочу сделать merge между data.frame биологических данных (а именно список видов с Вашим соответствующим изобилием) и другим массивом с этикеткой для каждого вида... с целью, когда я захочу реализовать plot, не реализовать это из-за видов, если не из-за этих этикеток, которые могут быть общими в несколько видов.

COM
Antant  Apoimb  Athpres Athspp  Blenni  Booboo  Chelab
10              75  
5                   
5               300 
21              400 
6               500 
9               100 

TROPHIC
        TG
Antant  PL
Apoimb  PL
Athpres PL
Athspp  PL
Blenni  CA
Booboo  PL
Chelab  DE

Я попробовал следующее, но без успеха:

`temp=merge(COM, TROPHIC, by = c("TG"), all.x=T, sort = FALSE)`
Error in fix.by(by.x, x) : 'by' must specify a uniquely valid column

Как мог бы делать merge?

1
задан 19.03.2018, 13:15
2 ответа

Во-первых я приготовлю пример на основании ее informaciГіn, который ты внес, предложу тебе, когда ты захочешь иметь informaciГіn, использовать их funciГіn dput() например dput(head(COM)), так как это производит "рукописный шрифт", чтобы производить точно объект, что ты хочешь иметь, с Вашим классом, с точным типом для каждой колонны, с факторами, если у него есть они, и т.д.

COM <- read.table(text="
Antant  Apoimb  Athpres Athspp  Blenni  Booboo  Chelab
10      75      0       0       0       0       0  
5       0       0       0       0       0       0  
5       300     0       0       0       0       0  
21      400     0       0       0       0       0   
6       500     0       0       0       0       0  
9       100     0       0       0       0       0  ", skip=1, header=TRUE)

TROPHIC <- read.table(text="
RN TG
Antant  PL
Apoimb  PL
Athpres PL
Athspp  PL
Blenni  CA
Booboo  PL
Chelab  DE
", skip=1, header=TRUE)

rownames(TROPHIC) <- TROPHIC[,1]
TROPHIC <- TROPHIC[2]

, Из-за которого в конце концов tendrГ-хозяева следующее:

> COM
  Antant Apoimb Athpres Athspp Blenni Booboo Chelab
1     10     75       0      0      0      0      0
2      5      0       0      0      0      0      0
3      5    300       0      0      0      0      0
4     21    400       0      0      0      0      0
5      6    500       0      0      0      0      0
6      9    100       0      0      0      0      0
> TROPHIC
       RN TG
1  Antant PL
2  Apoimb PL
3 Athpres PL
4  Athspp PL
5  Blenni CA
6  Booboo PL
7  Chelab DE

Проверяет пожалуйста, что данные соответствовали действительно твоим структурам.

SoluciГіn:

, Если окончательно то, что ты ищешь, состоит в том, чтобы прибывать в общее количество из-за этикетки, мы можем делать следующее:

COM <- as.data.frame(cbind(Total=colSums(COM)))
FINAL <- as.data.frame(cbind(COM, TG=TROPHIC[match(rownames(COM), rownames(TROPHIC)),]))
aggregate(. ~ TG, FINAL, sum)

Конечный результат:

  TG Total
1 CA     0
2 DE     0
3 PL  1431

Подробно описал:

  • Во-первых, с COM <- as.data.frame(cbind(Total=colSums(COM))) мы производим нового data.frame с суммой для каждого вида, чего-то asГ-:

            Total
    Antant     56
    Apoimb   1375
    Athpres     0
    Athspp      0
    Blenni      0
    Booboo      0
    Chelab      0
    
  • С as.data.frame(cbind(COM, TG=TROPHIC[match(rownames(COM), rownames(TROPHIC)),])) мы добавляем к каждому виду этикетку, которая соответствует ему, немного asГ-:

            Total TG
    Antant     56 PL
    Apoimb   1375 PL
    Athpres     0 PL
    Athspp      0 PL
    Blenni      0 CA
    Booboo      0 PL
    Chelab      0 DE
    
  • И из-за Гєltimo, с aggregate(. ~ TG, FINAL, sum) мы группируем из-за каждой этикетки и получаем конечную сумму:

      TG Total
    1 CA     0
    2 DE     0
    3 PL  1431
    
1
ответ дан 24.11.2019, 00:51
  • 1
    Muchí пропасти благодаря всем тем, кто habé is внесенный ваш песчаный гранит! – Alejandro 20.03.2018, 16:25

Одна aproximaciГіn альтернатива используя dplyr.

Я Воспроизвожу data.frame, которые он сделал Патрицианскими.

COM <- read.table(text="
Antant  Apoimb  Athpres Athspp  Blenni  Booboo  Chelab
10      75      0       0       0       0       0  
5       0       0       0       0       0       0  
5       300     0       0       0       0       0  
21      400     0       0       0       0       0   
6       500     0       0       0       0       0  
9       100     0       0       0       0       0  ", skip=1, header=TRUE)

TROPHIC <- read.table(text="
RN TG
Antant  PL
Apoimb  PL
Athpres PL
Athspp  PL
Blenni  CA
Booboo  PL
Chelab  DE
", skip=1, header=TRUE, stringsAsFactors = FALSE)

NГіtese, что не изменил rownames, и что переместил аргумент stringsAsFactors = FALSE, чтобы избегать переходить в фактор прямо в ней importaciГіn. Это не необходимый , но предотвращает один warning в inner_join().

ManipulaciГіn и краткое изложение данных: Последованные

COM %>% 
  gather(RN, valor) %>%           #Paso a formato largo, hago coincidir el nombre de la columna con el TROPHIC.
  inner_join(TROPHIC) %>%         #join de COM y TROPHIC, la columna RN está en ambos data.frame y por defaul es la clave del join. 
  group_by(TG) %>%                #agrupo, aplicará el sumario de la siguiente línea a cada uno de los grupos definidos aquí. 
  summarise(Total = sum(valor))   #Sumatoria de valor para cada grupo.  

:

# A tibble: 3 x 2
     TG Total
  <chr> <int>
1    CA     0
2    DE     0
3    PL  1431
0
ответ дан 24.11.2019, 00:51