У меня есть фрейм данных (abund
), аналогичный наборам данных dune
и dune.env
, используемым в пакете vegan
, за исключением того, что в моих первых трех столбцах обобщены sampleID и два метода, используемых для сбора данных.Данные об изобилии каждого вида собраны.
SampleID MethodA MethodB SpA SpB SpC ...
18001 A1 B1 0 3 4
18001 A1 B2 1 5 0
18001 A2 B1 0 7 0
18001 A2 B2 0 11 0
18002 A1 B1 4 1 0
18002 A1 B2 0 0 3
18002 A2 B1 0 0 0
18002 A2 B2 0 8 2
18003 A1 B1 0 9 0
....
Я хотел бы создать новый набор данных (whole
) на основе этих данных, но только с SampleID и MethodA в качестве идентификаторов строк.
SampleID MethodA MethodB SpA SpB SpC ...
18001 A1 B3 1 8 4
18001 A2 B3 0 18 0
18002 A1 B3 4 1 3
18002 A2 B3 0 8 2
18003 A1 B3 0 9 1
....
Дополнительный поворот заключается в том, что вместо простого добавления данных из B1 + B2 я сначала хочу умножить B1 на 15 (то есть: B3 = 15 * B1 + B2).
У меня есть две проблемы.
- умножение только определенных строк данных.
Я пытался использовать оператор if:
wholeCalc <- function(MethodB, multiplier=15){
whole <- MethodB* multiplier
if(MethodB= "B2") {
whole <- whole/multiplier
}
}
-> было множество ошибок, указывающих на то, что я далеко от цели!
выяснить, как группировать данные в зависимости от SampleID и MethodA.
Я попробовал несколько способов сгруппировать данные, но без особого успеха.
aggregate(abund,
list(Group=replace(rownames(abund$MethodB),
rownames(abund$MethodB)
%in%
c("B1","B2"),
"B3")),
sum)
-> Я получаю сообщение об ошибке, что аргументы должны быть одинаковой длины (т. Е. B1 и B2).
whole <- abund %>%
group_by(SampleID, MethodA)
whole
-> это дает мне тот же набор данных, с которого я начал.
rbind(abund,
c(MethodB = "B3",
abund[abund$MethodB == "B1", -3] +
abund[abund$MethodB == "B2", -3]))
-> это дает мне ошибку, потому что количество строк для B1 и B2 не совпадают.
Как видите, я совершенно потерян и мне нужна помощь!Я был в лаборатории в течение прошлых нескольких месяцев и позволил моим навыкам R стать ржавым.