1
votes

Les sommes conditionnelles basées sur les colonnes sont dupliquées (par ligne) dans R

Travailler sur un problème un peu délicat. Mon ensemble de données est le suivant:

  WS_bTIV WS_cTIV EQ_bTIV EQ_cTIV Tot_bTIV Tot_cTIV
1       5       0       5      10        5       10
2       0       5      10       5       10        5
3      10      10      10      10       10       10

J'essaie de créer une colonne de total qui totalisera les colonnes qui se terminent par "bTIV" indépendamment de ce qu'elles commencent. Cependant, les données sont dupliquées dans certaines colonnes. Par exemple, si vous regardez la ligne 1:

Les colonnes WS_bTIV et EQ_bTIV ont une valeur de 5. Cependant, la somme de ces valeurs nous donne 10. Cependant, je sais d'après les données que le total réel réel est en fait 5 et la valeur 5 a été dupliquée sur ces colonnes. Donc, le total dans ce cas devrait en fait être juste 5.

Parfois cependant (par exemple dans la ligne 2) la valeur peut être 0 et vous pouvez simplement résumer comme d'habitude.

Le le résultat doit être le suivant:

df <- data.frame("WS_bTIV" = c(5,0,10),"WS_cTIV" = c(0,5,10),"EQ_bTIV"=c(5,10,10),"EQ_cTIV"=c(10,5,10))

> df
  WS_bTIV WS_cTIV EQ_bTIV EQ_cTIV
1       5       0       5      10
2       0       5      10       5
3      10      10      10      10

Quelqu'un a-t-il des idées?


6 commentaires

S'agit-il des seules colonnes de votre dataframe ou avez-vous beaucoup plus de colonnes qui se terminent par "bTIV"?


Environ 20 au total


Et la justification est la suivante: si les valeurs des variables qui se terminent par le même modèle (par exemple "bTIV") sont toutes différentes, additionnez-les toutes comme d'habitude; sinon, s'il y a des doublons, supprimez-les pour obtenir des valeurs uniques et additionnez-les. Est-ce correct?


Comment déterminez-vous si WS_bTIV et EQ_bTIV doivent être ajoutés ou non?


Oui à peu près. La façon dont j'ai essayé était de compter le nombre de doublons (c'est-à-dire de compter le nombre de colonnes avec une valeur> 0 dans chaque colonne qui se termine par le bTIV par ligne) puis de diviser par ce nombre


@MartinGal Ils seront toujours identiques ou l'un d'eux sera égal à 0. S'ils sont identiques, supprimez-le


4 Réponses :


1
votes

Utilisation de la somme des valeurs uniques bTIV et cTIV par ligne

df$Tot_bTIV <- apply(df[grepl("bTIV$",colnames(df))], 1, function(x) sum(unique(x)))
df$Tot_cTIV <- apply(df[grepl("cTIV$",colnames(df))], 1, function(x) sum(unique(x)))


> df
  WS_bTIV WS_cTIV EQ_bTIV EQ_cTIV Tot_bTIV Tot_cTIV
1       5       0       5      10        5       10
2       0       5      10       5       10        5
3      10      10      10      10       10       10


0 commentaires

1
votes
# A tibble: 3 x 6
  WS_bTIV WS_cTIV EQ_bTIV EQ_cTIV Tot_bTIV Tot_cTIV
    <dbl>   <dbl>   <dbl>   <dbl>    <dbl>    <dbl>
1       5       0       5      10        5       10
2       0       5      10       5       10        5
3      10      10      10      10       10       10

0 commentaires

1
votes

C'est une combinaison des réponses de Daniel O et de dét, en utilisant dplyr:

df %>%
  rowwise() %>%
  mutate(Tot_bTIV = sum(unique(c(WS_bTIV, EQ_bTIV))) ,
         Tot_cTIV = sum(unique(c(WS_cTIV, EQ_cTIV))))


0 commentaires

0
votes

Une autre option est c_across de dplyr_1.0.0

library(dplyr)
df %>% 
     rowwise %>% 
     mutate(Tot_bTIV = sum(unique(c_across(ends_with('bTIV')))), 
            Tot_cTIV = sum(unique(c_across(ends_with('cTIV')))))
# A tibble: 3 x 6
# Rowwise: 
#  WS_bTIV WS_cTIV EQ_bTIV EQ_cTIV Tot_bTIV Tot_cTIV
#    <dbl>   <dbl>   <dbl>   <dbl>    <dbl>    <dbl>
#1       5       0       5      10        5       10
#2       0       5      10       5       10        5
#3      10      10      10      10       10       10


0 commentaires