2017-08-24 5 views
1

Ich möchte die Werte in Spalten in df1 summieren, wenn die entsprechenden Werte in der ersten Spalte [A] in df1 größer oder gleich sind ein Wert in DF2. Ich habe eine Reihe von Werten, die ich in df2 machen möchte. In Excel sieht die Formel etwa so aus: SUMME (df1 $ A,> = df2 $ Wert, df1 $ B) für eine Spalte.SUMME Spalte A wenn Spalte B größer oder gleich Spalte C in einem anderen Datenrahmen ist

df1:

[A] [B] [C] 
    1  10  20 
    2  20  20 
    3  20  30 
    4  10  50 
    5  30  10 

df2:

Value 
    1 
    3 
    5 

OUTPUT:

Value SUM[df1$B] SUM[df1$C] 
    1   90   130 
    3   60   90 
    5   30   10 

Antwort

0

Wir mit base R versuchen. Überstreichen Sie die 'Value'-Spalte von' df2 ', setzen Sie' df1 'auf die Bedingung, ob die Spalte' A 'größer oder gleich dem Wert in' df2 'ist, die Spaltensummen' B 'und' C‘Spalten, die rbindlist Elemente einen einzelnen Datensatz

res <- do.call(rbind, lapply(df2$Value, function(x) cbind(Value = x, 
      as.data.frame.list(colSums(df1[df1$A >= x, 2:3]))))) 
names(res)[-1] <- paste0("SUM_", names(res)[-1]) 
res 
#  Value SUM_B SUM_C 
#1  1 90 130 
#2  3 60 90 
#3  5 30 10 

zu erzeugen oder eine andere Option ist data.table

library(data.table) 
CJ(A=df1$A, Value = df2$Value)[A >= Value][df1, on = .(A) 
      ][, lapply(.SD, sum),Value, .SDcols = B:C] 
# Value B C 
#1:  1 90 130 
#2:  3 60 90 
#3:  5 30 10 
0

eine Idee über Basis R,

cbind(df2, 
     setNames(data.frame(t(sapply(df2$value, function(i) 
             sapply(2:ncol(df1), function(j) 
               sum(df[i:nrow(df1), j]))))), 
       paste0('SUM', '_', names(df1)[-1]))) 

, die

value SUM_V2 SUM_V3 
1  1  90 130 
2  3  60  90 
3  5  30  10 
gibt
Verwandte Themen