J'ai deux df de longueurs différentes, avec deux colonnes dans chacune qui ressemblent à ceci:

t<-c(1,3,4,2,6)
f<-c(3,4,5,6,8)
df1<- cbind(t,f)


t<-c(6,4,5,1,2,3,5,7,8,9)
f<-c(4,5,6,3,8,5,6,3,2,1)
df2<- cbind(t,f)

Ma question est de savoir comment ajouter une nouvelle colonne à df1 qui donne un 1 pour les valeurs correspondantes (dans l'une ou l'autre combinaison de valeurs, donc 5-3 et 3-5) entre les deux cols dans df1 et df2, et un 0 si les valeurs ne correspondent pas.

J'ai essayé case_when (ce qui n'est pas correct), mais je pourrais expliquer ce que j'essaie de demander ici (bien que je sache que cela devrait être exécuté avec les deux combinaisons de $ t et $ f)

df1$b <- case_when(df1$t & df1$f == df2$t & df2$f ~ '1') %>%
replace_na(0)

J'espère que cela à du sens.

Jamie

0
Jamie Dunning 16 sept. 2020 à 16:44

2 réponses

Meilleure réponse

C'est la solution la plus simple à laquelle je puisse penser:

df1$b <- paste(df1$t,df1$f) %in% paste(df2$t,df2$f) | 
         paste(df1$f,df1$t) %in% paste(df2$t,df2$f)

Le symbole | signifie "OU" logique, le %in% vérifie si chaque élément du premier élément est dans l'ensemble du deuxième élément.

3
Javi_VM 16 sept. 2020 à 13:57

Vous pouvez faire avec la base R:

df1 <- data.frame(
  t=c(1,3,4,2,6),
  f=c(3,4,5,6,8))

df2 <- data.frame( 
  t=c(6,4,5,1,2,3,5,7,8,9),
  f=c(4,5,6,3,8,5,6,3,2,1))

df1$tf <- with(df1, paste0(t, '#', f))
df1$ft <- with(df1, paste0(f, '#', t))

df1$b <- with(df1, tf %in% paste0(df2$t, '#', df2$f) | ft %in% paste0(df2$t, '#', df2$f))
# > df1
#   t f  tf  ft  test
# 1 1 3 1#3 3#1  TRUE
# 2 3 4 3#4 4#3 FALSE
# 3 4 5 4#5 5#4  TRUE
# 4 2 6 2#6 6#2 FALSE
# 5 6 8 6#8 8#6 FALSE

Ou pour faire court:

df1$b <- with(df1, paste0(t, '#', f) %in% paste0(df2$t, '#', df2$f) | 
                paste0(f, '#', t) %in% paste0(df2$t, '#', df2$f))

Ou

df2tf <- with(df2, paste0(t, '#', f)
df1$b <- with(df1, paste0(t, '#', f) %in% df2tf | paste0(f, '#', t) %in% df2tf)
3
jogo 16 sept. 2020 à 14:22