Я хочу сделать 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?
Во-первых я приготовлю пример на основании ее 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
Проверяет пожалуйста, что данные соответствовали действительно твоим структурам.
, Если окончательно то, что ты ищешь, состоит в том, чтобы прибывать в общее количество из-за этикетки, мы можем делать следующее:
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
Одна 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()
.
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