Как назначить суммы строк фрейма данных в R по столбцу в том же фрейме данных

У меня есть следующий фрейм данных в R

 DF1<-data.frame("S"=c("A", "B", "C"))
 namelist<-c("A", "B", "C")
 DF1[c("A", "B", "C")]<-c(1,2,3)
 DF1$B<-DF1$B*2

Я создал новый столбец Сумма следующим образом

  DF1$Sum<-0

Результирующий кадр данных выглядит следующим образом

 S A B C Sum
 A 1 2 1   0
 B 2 4 2   0
 C 3 6 3   0

Я хочу, чтобы значения в Sum были заполнены таким образом, чтобы значения в строке A Sum были равны сумме записей в столбце A и аналогично для B и C. Результат должен быть следующим

  S A B C Sum
1 A 1 2 1   6
2 B 2 4 2   10
3 C 3 6 3   6

Я пробовал следующий код

 for( i in 1:nrow(DF1)){
  for( j in namelist){
 DF1$Sum[DF1$S[j][i]]=sum(DF1[,j])
  }}

Я не получаю желаемого результата. Я получаю следующий вывод. Я прошу кого-нибудь помочь мне здесь.

  S A B C Sum
1 A 1 2 1   0
2 B 2 4 2   0
3 C 3 6 3   0

person Raghavan vmvs    schedule 22.08.2019    source источник
comment
да должно. Извиняюсь за опечатку. исправил так же   -  person Raghavan vmvs    schedule 22.08.2019


Ответы (3)


Вот быстрый цикл, который достиг вашей цели

for(i in 1:nrow(DF1)){
DF1$SUM[i] <- sum(DF1[,i+1])
}
person Daniel O    schedule 22.08.2019

Одна dplyr возможность может быть:

DF1 %>%
 mutate(sum = colSums(.[-1]))

  S A B C sum
1 A 1 2 1   6
2 B 2 4 2  12
3 C 3 6 3   6

Или то же самое с base R:

DF1$sum <- colSums(DF1[-1])
person tmfmnk    schedule 22.08.2019
comment
@David Arenburg, хорошее упрощение, спасибо :) Честно говоря, с dplyr это просто фиксация, здесь это действительно не важно. - person tmfmnk; 22.08.2019

Вот более общий способ сделать это с произвольной последовательностью символов, то есть если символы не в том же порядке, что и столбцы.

tmp=colSums(DF1[,-1])
tmp2=data.frame(S=names(tmp),Sum=tmp)
merge(DF1,tmp2,by="S")
person user2974951    schedule 22.08.2019