R-свернуть строки и суммировать значения в столбце
у меня есть следующий фрейм данных (df1):
ID someText PSM OtherValues ABC c 2 qwe CCC v 3 wer DDD b 56 ert EEE m 78 yu FFF sw 1 io GGG e 90 gv CCC r 34 scf CCC t 21 fvb KOO y 45 hffd EEE u 2 asd LLL i 4 dlm ZZZ i 8 zzas
Я хотел бы свернуть первый столбец и добавить соответствующие значения PSM и я хотел бы получить следующий результат:
ID Sum PSM
ABC 2
CCC 58
DDD 56
EEE 80
FFF 1
GGG 90
KOO 45
LLL 4
ZZZ 8
это кажется выполнимым с агрегатной функцией, но не знает синтаксиса. Любая помощь действительно ценится! Спасибо.
4 ответов
в базе:
aggregate(PSM ~ ID, data=x, FUN=sum)
## ID PSM
## 1 ABC 2
## 2 CCC 58
## 3 DDD 56
## 4 EEE 80
## 5 FFF 1
## 6 GGG 90
## 7 KOO 45
## 8 LLL 4
## 9 ZZZ 8
пример использования dplyr, следующая итерация plyr:
df2 <- df1 %>% group_by(ID) %>%
summarize(Sum_PSM = sum(PSM))
когда вы ставите символы %>%
, вы "трубопроводов."Это означает, что вы вводите то, что находится на левой стороне этого оператора трубы, и выполняете функцию справа.
использование агрегатной функции кажется лучше, чем dplyr, если вы хотите просто сохранить исходные имена столбцов и работать внутри одного столбца за раз. Избегая использования функции суммирования,
Примечание от функции summarize документации
будьте осторожны при использовании существующих имен переменных; соответствующие столбцы будут немедленно обновлены с новыми данными, и это может влияют на последующие операции, относящиеся к тем переменная.
например
## modified example from aggregate documentation with character variables and NAs
testDF <- data.frame(v1 = c(1,3,5,7,8,3,5,NA,4,5,7,9),
v2 = c(11,33,55,77,88,33,55,NA,44,55,77,99) )
by <- c("red", "blue", 1, 2, NA, "big", 1, 2, "red", 1, NA, 12)
aggregate(x = testDF, by = list(by1), FUN = "sum")
Group.1 v1 v2
1 1 15 165
2 12 9 99
3 2 NA NA
4 big 3 33
5 blue 3 33
6 red 5 55
вы получаете то, что хотите, но при использовании summarise и ddply вам нужно указать имена. Поэтому, если у вас много столбцов, aggregate кажется удобным.
testDF$ID=by1
ddply(testDF, .(ID), summarize, v1=sum(v1), v2=sum(v2) )
ID v1 v2
1 1 15 165
2 12 9 99
3 2 NA NA
4 big 3 33
5 blue 3 33
6 red 5 55
7 <NA> 15 165
чтобы увидеть эффект немедленного обновления столбцов с суммированием, вы можете проверить следующие примеры,
ddply(testDF, .(ID), summarize, v1=max(v1,v2), v2=min(v1,v2) )
ID v1 v2
1 1 55 55
2 12 99 99
3 2 NA NA
4 big 33 33
5 blue 33 33
6 red 44 11
7 <NA> 88 77
ddply(testDF, .(ID), summarize, v1=min(v1,v2), v2=min(v1,v2) )
ID v1 v2
1 1 5 5
2 12 9 9
3 2 NA NA
4 big 3 3
5 blue 3 3
6 red 1 1
7 <NA> 7 7
обратите внимание, что когда V1 использует max, col уже обновляется при вычислении v2, поэтому, например, в случае ID=1 мы не можем получить число 5 при использовании min в v2.