question difficile à la phrase. Voici un exemple de ce que j'aimerais faire. Un exemple de ce que je commence par: pour toutes les paires de colonnes qui partagent un médicament (par exemple, «DR1»), je souhaite regrouper des lignes de «SYM», puis sélectionnez la ligne avec La plus petite valeur p (se termine par'P ') au sein de chaque groupe. Le résultat final de la carte ci-dessus. La carte serait la suivante: p> dr1.d dr1.p dr2.d dr2.p dr3.d dr3.p dr4.d dr4.p sym
1: 1.3297993 0.0235776357 -0.7990092 0.02017788 -0.22426789 0.040288638 -0.4333103 0.03436105 sym 1
2: 1.2724293 0.0004613738 -0.2894616 0.03485466 -0.05710677 0.003738094 0.7267507 0.02234770 sym 2
3 Réponses :
Avec de la fusion et de la coulée, c'est assez simple
Voici une approche tout-en-une, bien que vous souhaitiez la diviser en étapes séparées pour la lisibilité:
dcast(melt(dt, measure = patterns("\\.p$", "\\.d$"), id.vars = "sym",
value.name = c("p", "d"))[, .SD[which.min(p)], by = list(sym, variable)],
sym ~ variable, value.var = c("p", "d"))
# sym p_1 p_2 p_3 p_4 d_1 d_2 d_3 d_4
#1: sym 1 0.0235776357 0.02017788 0.040288638 0.03436105 1.329799 -0.7990092 -0.22426789 -0.4333103
#2: sym 2 0.0004613738 0.03485466 0.003738094 0.02234770 1.272429 -0.2894616 -0.05710677 0.7267507
la chose la plus importante (et la plus puissante) à comprendre sur Avec cette connaissance et cette base R amusement, nous pouvons obtenir ce résultat directement en faisant: p> voir le pour plus. P> p> data.table code> est que, aussi longtemps que j code> renvoie une liste em>, chacun L'élément de la liste deviendra une colonne dans le résultat.