2017-08-24 4 views
1

Je voudrais additionner les valeurs dans les colonnes de df1 si les valeurs correspondantes dans la première colonne [A] dans df1 sont supérieures ou égales à une valeur en df2. J'ai une gamme de valeurs que je voudrais faire pour df2. En excel, la formule ressemblerait à quelque chose comme: SUMIF (df1 $ A,> = df2 $ Valeur, df1 $ B) pour une colonne.SUMIF Colonne A si la colonne B est supérieure ou égale à la colonne C dans une autre trame

DF1:

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

DF2:

Value 
    1 
    3 
    5 

SORTIE:

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

Répondre

0

Nous pouvons essayer avec base R. Boucle sur la colonne 'Valeur' ​​de 'df2', sous-ensemble de 'df1' basé sur la condition que la colonne 'A' soit supérieure ou égale à la valeur dans 'df2', récupère la somme des colonnes 'B' et ' les colonnes C », rbind les list éléments pour créer un seul ensemble de données

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 

ou une autre option est 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

une idée de base par l'intermédiaire de 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]))) 

qui donne,

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