Один вариант использовал бы dplyr
. Мы группа по «А», а также создать новый столбец «всего» в качестве sum
из «Freq», filter
рядам, где «B» = 1, и select
все остальные столбцы, кроме «B»
library(dplyr)
frame %>%
group_by(A) %>%
mutate(total= sum(Freq)) %>%
filter(B==1)%>%
select(-B)
# A Freq total
#1 0 8 83
#2 1 6 27
Or используя data.table
, мы преобразовать data.frame
к data.table
(setDT(frame)
или мы можем сделать as.data.table(frame)
), создать новый столбец total
как sum
из «Freq», сгруппированных по «A», подмножество строк с в = 1, и удалите «B ', присвоив его NULL.
library(data.table)
setDT(frame)[, total:= sum(Freq), A][B==1][,B:=NULL]
# A Freq total
#1: 0 8 83
#2: 1 6 27
Или с помощью base R
, мы создаем «общее» с помощью transform/ave
, а затем subset
строки, которые являются 1 для «B».
subset(transform(frame, total=ave(Freq, A, FUN=sum)), B==1, select=-B)
# A Freq total
#3 0 8 83
#4 1 6 27
Лучше всего объяснить словами, что вы хотите, а не просто показать вход и выход. – Frank
Вы хотите получить полные значения A, равные 0, общие значения B, равные 0, и то же самое для A и B, но с 1? Кажется, что есть несогласованность в трансформации, которую вы имеете в ожидаемой форме. –
извините. Я забыл сказать, что B = 1 – Program