2017-05-30 4 views
0

Je suis sûr que je peux trouver une solution simple à ce problème, mais je n'ai pas vu une question comparable alors j'ai pensé poser une question . J'ai un ensemble de données longitudinales avec des milliers de répondants sur plusieurs intervalles de temps. Tout des questions aux types de données peut différer entre les vagues et nécessite souvent la construction de longues séries de booléens pour construire des indicateurs ou des variables fictives, mais chaque répondant a une identification unique sans aucun répondant additionnel aux enquêtes après la première vague, si facile assez.R - Comparer les valeurs de colonne dans les trames de données de longueurs différentes par ID unique

Le problème est que, bien que les premières vagues se composent d'un fichier (Stata) chacune, ces dernières contiennent beaucoup de fichiers d'addenda, structurés différemment. Ainsi, par exemple, en construisant des indicateurs antérieurs pour le sexe des partenaires précédents, il y avait des colonnes (pour une vague) appelées partnerNum et sexe et il y avait jusqu'à 16 lignes pour chaque ID unique (répondant). Assez facile pour diffuser (ou diffuser) ces données afin de pouvoir créer une seule ligne pour chaque identifiant unique et les colonnes partnerNum_1 ... partnerNum_16 avec la valeur de la colonne de sexe comme entrée dans partnerDF. Ensuite, il est facile de construire des indicateurs tels que:

sexuality$newIndicator[mainDF$bioSex = "Male" & apply(partnerDF[1:16] == "Male", 1, any)] <- 1 

Pour d'autres fichiers additif dans les deux dernières vagues les données sont structurées à long comme les données partenaire, avec plusieurs lignes pour chaque ID unique, mais plutôt que d'une variable comme le sexe il y en a des centaines que j'ai besoin d'utiliser pour tester la construction d'indicateurs, tous codés avec des types différents, donc il est impossible de répandre (ou de lancer) les données à l'échelle (sans parler de l'écriture de ces booléens). Il y a en fait plusieurs de ces fichiers pour chaque vague et la façon dont ils sont structurés certains répondants (ID unique) n'occupent qu'une rangée, quelques dizaines. (. J'ai left_join'ed l'addendum fichiers ensemble pour chaque vague)

Ce que je voudrais pouvoir faire quelque chose à est de test comme:

newDF$indicator[any(waveIIIAdds$var1 == 1) & any(waveIIIAdds$var2 == 1)] <- 1 

ou

newDF$indicator[mainDF$var1 == 1 & any(waveIIIAdds$var2 == 1)] <- 1 

où newDF a la même longueur que mainDF (une ligne par ID unique). Donc, par exemple, si j'avais deux dfs. Par exemple,

df1 <- data.frame(ID = c(1:4), A = rep("a")) 
df2 <- data.frame(ID = rep(1:4, each=2), B = rep(1:2, 2), stringsAsFactors = FALSE) 
df1$A[1] <- "b" 
df1$A[3] <- "b" 
df2$B[8] <- 3 

> df1 > df2 
ID A ID B 
1 b 1 1 
2 a 1 2 
3 b 2 1 
4 a 2 2 
     3 1 
     3 2 
     4 1 
     4 3 

Je voudrais tester comme (en supposant DF3 a une colonne, à l'ID unique de DF1)

df3$new <- 0 
df3$new[df1$ID[df1$A == "a"] & df2$ID[df2$B == 2]] <- 1 

Alors que DF3 aurait un identifiant unique par ligne et car il y a une "a" dans df1 $ A pour tous les ID mais df1 $ A [1] et un 2 dans au moins une ligne de df2 $ B pour tous les ID sauf le dernier ID (df2 $ B [7: 8]) le résultat serait :

> df3 
ID new 
1 0 
2 1 
3 1 
4 0 

et

df3$new <- 0 
df3$new[df1$ID[df1$A == "a"] | df2$ID[df2$B == 2]] <- 1 

> df3 
ID new 
1 1 
2 1 
3 1 
4 0 

Répondre

0

Cela le fait ...

df3 <- data.frame(ID=unique(df1$ID), 
        new=sapply(unique(df1$ID),function(x) 
        as.numeric(x %in% df1$ID[df1$A == "a"] & x %in% df2$ID[df2$B == 2]))) 

df3 
    ID new 
1 1 1 
2 2 1 
3 3 1 
4 4 0 
+0

Cela fonctionnerait pour l'exemple mais ne fonctionnerait pas pour les données réelles. Je peux penser à un exemple où cela faciliterait la construction d'un ensemble de données! Merci! –

0

je suis venu avec une solution parcimonieuse y penser pendant quelques minutes après son retour au problème (plutôt que les petites heures du matin du poste).Je voulais quelque chose d'un étudiant diplômé qui construirait probablement des milliers d'indicateurs ou de variables fictives de cette façon et pourrait apprendre R d'abord, ou même seulement apprendre R, pourrait utiliser. Voici une solution pour l'exemple et les données réelles en utilisant le même schéma:

si le DF a déjà été créé avec les ID et les valeurs de la colonne pour l'indicateur factice initié à zéro déjà comme supposé dans l'exemple:

df3 <- data.frame(ID = df1$ID) 
df3$new <- 0 

Ma solution a été:

df3$new[df1$ID %in% df1$ID[df1$A == "a"] & df1$ID %in% df2$ID[df2$B == 2]] <- 1 

> df3 
ID new 
1 0 
2 1 
3 0 
4 1 

L'utilisation | (ou) à la place:

df3$new[df1$ID %in% df1$ID[df1$A == "a"] | df1$ID %in% df2$ID[df2$B == 2]] <- 1 

> df3 
ID new 
1 1 
2 1 
3 0 
4 1