Сумма значений в столбце на основе значений в других столбцах; Часть 2

#r

Вопрос:

В моей таблице ниже первый столбец представляет собой троичный символ (A, B и C). Второй столбец-это числовые значения. Для C у нас есть NA в таблице: Таблица

Как и в части 1, мне нравится суммировать значения во втором столбце на основе значений в первом столбце, но на этот раз так: Таблица

Она-мой фрейм данных:

 df <-data.frame('V1' = c('A',   'A',    'A',    'A',    'B',    'B',    'B',    'B',    'C',    'A',    'A',    'B',    'B',    'B',    'C',    'A',    'A',    'A',    'B',    'C',    'A',    'B',    'B',    'B',    'C'),'V2' = c(1,    3,  4,  2,  1,  1,  2,  3,  NA, 2,  4,  2,  4,  5,  NA, 3,  3,  2,  2,  NA, 5,  5,  2,  3,  NA))
 

Обратите внимание, что значение C равно:

C = (Sum(A) -sum(B)) .

Не могли бы вы, пожалуйста, помочь мне и с этим тоже? Заранее большое вам спасибо!

Комментарии:

1. Я думаю, что это те же фотографии

2. Да, извините, я все исправил. Не могли бы вы, пожалуйста, взглянуть на это еще раз? Спасибо!

Ответ №1:

Это сработает:

 df <-data.frame('V1' = c('A',   'A',    'A',    'A',    'B',    'B',    'B',    'B',    'C',    'A',    'A',    'B',    'B',    'B',    'C',    'A',    'A',    'A',    'B',    'C',    'A',    'B',    'B',    'B',    'C'),'V2' = c(1,    3,  4,  2,  1,  1,  2,  3,  NA, 2,  4,  2,  4,  5,  NA, 3,  3,  2,  2,  NA, 5,  5,  2,  3,  NA))
df$V3<-NA
helper=data.frame('H',0,0)
names(helper)<-c('V1','V2','V3')
df<-rbind(df, helper)
c=0
for (i in (1:(length(df$V1)-1))) {
  if (df$V1[i]==df$V1[i 1]) {
    c = c df$V2[i]
  }
  else {
    df$V3[i]<- c df$V2[i]
    c=0
    next
  }
}

df<- head(df,-1)

a<-na.omit(df$V3[df$V1=="A"])
b<-na.omit(df$V3[df$V1=="B"])
c=a-b
df$V3[df$V1=="C"]<-c
 

Примечание: Это решение не будет соответствовать изображенной таблице из-за того, что предоставленный фрейм данных не точно соответствует изображенной таблице. Также вы заметите, что это решение совпадает с частью 1, за исключением добавления нижних 4 строк.

Ответ №2:

Вот вариант, не очень прямой, но я думаю, что он делает то, что вы хотите!

 library(tidyverse)

# Creating here a unique index "ind"
df <- df %>% mutate(ind = with(rle(V1), rep(ave(values, values, FUN = seq_along), lengths)),
              ind = paste(V1,ind,sep = "_"))

# Sum up by group
df <- df %>% group_by(ind, V1) %>% summarise(sum = sum(V2))

# Substract A - B
# First, get the index back
df <- df %>% separate(ind, c(NA, "ind"), sep = "_") 
# Then, manipulate a bit the dataframe to get B - A
df <- df %>% pivot_wider(id_cols = ind, names_from = V1, values_from = sum)%>%
  mutate(C = A - B)

# go back to initial structure
df <- df %>% pivot_longer(cols = A:C, names_to = "V1", values_to = "sum")

# you can get rid of the index column
df %>% select(!ind)
 

Лучшие,
Розали

Комментарии:

1. Большое тебе спасибо, Розали! Я протестирую его в выходные!

2. Дорогая Розали, кажется, что я теряю структуру своей таблицы (df) после «сумма». Можно ли получить результаты (A-B) перед C в столбце V3 без потери структуры моей таблицы?