Vérifier si chaque ligne a le nom de la colonne apparaître dans un autre data.frame, rapport TRUE et FALSE


Molly_K

Je voudrais remplir df3avec TRUE ou FALSE si le code est présent dans df2. Je n'ai pas trouvé de mots simples pour le décrire, j'ai donc créé des exemples de jouets ci-dessous. J'ai essayé do.call(paste0, df3) %in% do.call(paste0, df2), mais il ne rapporte pas ce dont j'avais besoin et je n'étais pas sûr de ce qu'il rapportait. Quelqu'un pourrait-il me diriger vers une fonction que je pourrais utiliser?

 df0=data.frame(ID=paste0("id_",1:5), Code=paste0("00",seq(1,10,2)))
 df1=data.frame(ID=rep(paste0("id_",1:2)), Code=paste0("00",seq(1,10,3)))
 df2=rbind.data.frame(df0,df1)
 df3=data.frame(ID=unique(df2$ID))
 namevector <- as.character(unique(df2$Code))
 df3[ , namevector] <- NA

> df2
        ID Code
    1 id_1  001
    2 id_2  003
    3 id_3  005
    4 id_4  007
    5 id_5  009
    6 id_1  001
    7 id_2  004
    8 id_1  007
    9 id_2 0010

> df3
    ID 001 003 005 007 009 004 0010
1 id_1  NA  NA  NA  NA  NA  NA   NA
2 id_2  NA  NA  NA  NA  NA  NA   NA
3 id_3  NA  NA  NA  NA  NA  NA   NA
4 id_4  NA  NA  NA  NA  NA  NA   NA
5 id_5  NA  NA  NA  NA  NA  NA   NA
Allan Cameron

Dans la base R, vous pouvez le faire très simplement en une seule ligne :

table(df2$ID, df2$Code) > 0
      
#>         001  0010   003   004   005   007   009
#>  id_1  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE
#>  id_2 FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE
#>  id_3 FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
#>  id_4 FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
#>  id_5 FALSE FALSE FALSE FALSE FALSE FALSE  TRUE

Ou, comme le souligne Akrun, même simplement :

table(df2) > 0
#>       Code
#> ID       001  0010   003   004   005   007   009
#>   id_1  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE
#>   id_2 FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE
#>   id_3 FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
#>   id_4 FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
#>   id_5 FALSE FALSE FALSE FALSE FALSE FALSE  TRUE

Articles connexes