0
votes

R Data.Table sous-ensemble par la valeur de la colonne

Je me demande dans data.Table Quel est le moyen le plus efficace ou le plus propre de sélectionner des lignes en fonction de la survenue de certaines valeurs de colonne. Par exemple, dans une table de données à 7 colonnes, chaque valeur étant 1 ou 0, je veux toutes les lignes où il y a exactement 2 valeurs de 1 et 5 valeurs de 0 (1 représentant "présence" et 0 "absence").

Jusqu'à présent, voici ce que je fais ce que je fais, en supposant que les données suivantes.Table (beaucoup plus grande, voici juste un échantillon de celui-ci) xxx

Et si je veux toutes les lignes où j'en ai 7 1 et disons seulement 1 dans d2a1.var et d3a1.var je fais ce qui suit xxx

Ceci renvoie la résultat attendu et est assez rapide. Toutefois, lorsqu'il s'agit de plusieurs conditions, il s'agit de nombreuses saisies et beaucoup de données .Table créations. Y a-t-il un moyen plus rapide, plus propre et plus compact de réaliser cela?


1 commentaires

"Par exemple, dans une table de données à 7 colonnes, chaque valeur étant 1 ou 0, je veux toutes les lignes où il y a exactement 2 valeurs de 1 et 5 valeurs de 0." Je ferais juste réduire ("+", .sd) == 2 et utilisez-le pour sous-ensemble.


3 Réponses :


1
votes

Nous pouvons utiliser le .sdcols en spécifiant les colonnes d'intérêt. Boucle via le sous-ensemble de données.Table ( .sd ) Créer une liste de de logique vecteur et réduit Un seul logique vecteur avec et xxx

xxx


0 commentaires

1
votes

Y a-t-il un moyen plus rapide, plus propre et plus compact de la réalisation de cela? p>

faire des requêtes distinctes et la rurdition comme vous le faites est probablement la plus simple. p>

Vous pouvez simplifier chaque requête en utilisant remplacer code> et joindre la syntaxe: p> xxx pré>

(ce code n'est pas testé car les données de l'OP n'est pas facilement reproductible.) p>

Vous pouvez probablement simplifier plus loin comme ... p> xxx pré>

concernant la fonction subit code> pour sous-ensemble / Semi-Join, vous pouvez le modifier pour répondre à vos besoins en fonction de réponses à Effectuer une jointure semi-jointure avec données.Table p>


EDIT: OH DROITE, suivez la réponse de @ Chinsoon, vous pouvez également vous rbind Premier: P>

subit(rbindlist(list(
  replace(vec0, names(vec0), 1),
  replace(vec0, c("D2A1.var", "D3A1.var"), 1)      
)))


0 commentaires

1
votes

Une autre option à l'aide de Set Tkey CODE>:

DT <- fread("D2A1.var D2B3.var D3A1.var D4A3.var D5B3.var H2A3.var H4A4.var MA_ancestor.var
1        1        1        1        1        1        1               1
1        1        1        1        1        1        1               1
1        1        1        1        1        1        1               1
1        1        1        1        1        1        1               1
1        1        1        1        1        1        1               1
1        1        1        1        1        1        1               1
0        0        0        0        0        1        0               1
0        0        0        0        0        0        0               1
0        0        0        0        0        0        0               1")


0 commentaires