umrechnen data.frame zu 'data.table' (setDT(df1)
), gruppiert nach 'ID', 'Typ', wenn die Anzahl der Beobachtungen ist größer als 1, mache die Division wie im Post des OP gezeigt oder gebe 0 zurück. Entferne die 'Flag' Spalte, dann erhält man die sum
von 'Value1' und 'Value2' gruppiert nach 'ID' und 'Type' und nehmen Sie die unique
library(data.table)
setDT(df1)[, Result := if(.N >1) round(100*Value1[1]/(Value2[1]+Value2[2]), 3)
else 0, .(ID, Type)]
df2 <- df1[, -3, with = FALSE]
df2[, (3:4) := lapply(.SD, sum), .SDcols = Value1:Value2, .(ID, Type)]
unique(df2)
# ID Type Value1 Value2 Result
#1: 1 Apple 29313 30835 0.003
#2: 1 Orange 2222 3423 0.000
#3: 2 Orange 24566 32234 0.000
Oder wir können die tidyverse
in einem einzigen Strom verwenden. Nach Gruppierung von 'ID', 'Typ', erstellen Sie das 'Ergebnis' Spalte, gefolgt von der sum
von ‚Value bekommen columns with
mutate_at , remove the 'Flag' and get the
distinct` Reihen
library(dplyr)
df1 %>%
group_by(ID, Type) %>%
mutate(Result = round(100*if(n()==2) first(Value1)/(first(Value2)+last(Value2))
else 0, 3)) %>%
mutate_at(vars(matches('Value')), sum) %>%
select(-Flag) %>%
distinct
# A tibble: 3 x 5
# Groups: ID, Type [3]
# ID Type Value1 Value2 Result
# <int> <chr> <int> <int> <dbl>
#1 1 Apple 29313 30835 0.003
#2 1 Orange 2222 3423 0.000
#3 2 Orange 24566 32234 0.000
Hey Danke! Aber Wert 2 in der ersten Zeile sollte 30835 sein! – AB6