2017-05-19 2 views
1

J'ai une grande table de données à partir de laquelle je veux regrouper une colonne basée sur la valeur d'une autre colonne qui répond aux critères d'un tiers colonne. Je peux le faire avec une boucle mais je me demande si cela peut être fait dans data.table?groupe une colonne par les valeurs de la deuxième colonne basée sur la condition de la troisième colonne dans data.table

Le tableau se présente comme suit:

Group Col1 Col2 
1:  A 1 0.0 
2:  A 2 0.1 
3:  A 3 0.2 
4:  A 4 0.5 
5:  A 5 0.9 
6:  B 6 0.0 
7:  B 7 0.2 
8:  B 8 0.4 
9:  B 9 0.9 
10: B 10 1.0 

Ce que j'ai besoin est pour chaque groupe obtenir la valeur de la ligne de Col1 où Col2 est le plus proche de 0,5. Col2 est une valeur cumulative qui peut varier de 0 à 1. Le résultat attendu est:

Group Col1 
1:  A 4 
2:  B 8 

cela peut être fait en data.table ?. J'ai du mal à le faire, donc toute contribution ou conseil sera grandement apprécié. Voici data.table ci-dessus

DAT=data.table(Group=c(rep("A",5),rep("B",5)),Col1=1:10,Col2=c(0,.1,.2,.5,.9,0,.2,.4,.9,1)) 

Répondre

3

Après regroupement par « groupe », prendre la différence absolue de « Col2 » avec 0,5, obtenir l'indice o la valeur minimale (which.min) et l'utiliser pour sous-ensemble de la « Col1 »

DAT[, .(Col1 = Col1[which.min(abs(Col2 - 0.5))]), Group] 
# Group Col1 
#1:  A 4 
#2:  B 8 
+0

Merci, c'est une solution très soignée – Camilo

2

Ce que j'ai besoin est pour chaque groupe obtenir la valeur de la ligne de Col1 où Col2 est le plus proche de 0,5.

Utilisez un roulement rejoindre:

DAT[.(unique(Group), .5), on=.(Group, Col2), roll="nearest"] 
# Group Col1 Col2 
# 1:  A 4 0.5 
# 2:  B 8 0.5