#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 без потери структуры моей таблицы?