1
votes

Identifier et regrouper les observations

Comment puis-je identifier et générer une nouvelle variable qui identifie les observations appartenant à différents groupes. Disons que j'ai l'ensemble de données suivant:

ID | country  |  side  | sideuk
1  |  arg     |  1     |  0
1  |  usa     |  0     |  0
2  |  ita     |  1     |  1
2  |  usa     |  0     |  0
2  |  uk      |  1     |  1
3  |  aus     |  0     |  0
3  |  uk      |  1     |  1

et que je souhaite créer une nouvelle variable (sideUK) qui identifie si le pays "uk" était impliqué dans l'ID et le côté de chaque pays. Donc, par exemple, ce serait:

ID | country  |  side  
1  |  arg     |  1
1  |  usa     |  0
2  |  ita     |  1
2  |  usa     |  0
2  |  uk      |  1
3  |  aus     |  0
3  |  uk      |  1


0 commentaires

3 Réponses :


2
votes

Je ne suis pas tout à fait sûr de ce que vous recherchez, mais ce qui suit reproduit votre résultat attendu

df <- read.table(text =
    "ID  country    side
1    arg       1
1    usa       0
2    ita       1
2    usa       0
2    uk        1
3    aus       0
3    uk        1", header = T)

Exemple de données

library(dplyr)
df %>%
    group_by(ID) %>%
    mutate(sideuk = +("uk" %in% country & side == 1)) %>%
    ungroup()
## A tibble: 7 x 4
#     ID country  side sideuk
#  <int> <fct>   <int>  <int>
#1     1 arg         1      0
#2     1 usa         0      0
#3     2 ita         1      1
#4     2 usa         0      0
#5     2 uk          1      1
#6     3 aus         0      0
#7     3 uk          1      1


0 commentaires

2
votes

Vous souhaitez grouper par ID, puis rechercher 'uk' dans la variable country

df %>%
    group_by(ID, side) %>%
    mutate(sideuk = as.integer('uk' %in% country))

# A tibble: 7 x 4
# Groups:   ID, side [6]
     ID country  side sideuk
  <dbl> <fct>   <dbl>  <int>
1     1 arg         1      0
2     1 usa         0      0
3     2 ita         1      1
4     2 usa         0      0
5     2 uk          1      1
6     3 aus         0      0
7     3 uk          1      1


0 commentaires

0
votes

Je ne sais pas si c'est ce que vous recherchez. C'est une solution sans bibliothèques externes:

df <- read.table(text =
                   "ID  country    side
                 1    arg       1
                 1    usa       0
                 2    ita       1
                 2    usa       0
                 2    uk        1
                 3    aus       0
                 3    uk        1
                 4    mx        1
                 4    uk        0", header = T)

Renvoie:

  ID country side sideuk
1  1     arg    1      0
2  1     usa    0      0
3  2     ita    1      1
4  2     usa    0      0
5  2      uk    1      1
6  3     aus    0      0
7  3      uk    1      1
8  4      mx    1      0
9  4      uk    0      0

Exemple de données

df$sideuk <- apply(df, 1, function(row) {
  return(
    as.integer(any(df[df$ID==row["ID"] & df$country=="uk" & row["side"] == 1, "side"]))
  )
})


0 commentaires