appliquer une fonction sur des groupes de colonnes
Comment puis-je utiliser apply
ou une fonction pour créer un nouveau bloc de données qui contient les résultats de la ligne des moyennes de chaque paire de colonnes dans un très grand bloc de données?
J'ai un instrument sorties n
des mesures répétées sur un grand nombre d'échantillons, où chaque mesure unique est un vecteur (toutes les mesures sont de la même longueur des vecteurs). J'aimerais calculer la moyenne (et d'autres statistiques) sur l'ensemble des mesures répétées de chaque échantillon. Cela signifie que j'ai besoin de groupe n
colonnes consécutives ensemble et à faire de la ligne sage calculs.
Pour un exemple simple, avec trois mesures répétées sur les deux échantillons, comment puis-je retrouver avec un bloc de données qui a deux colonnes (une par exemple), qui est la moyenne de chaque ligne de la réplique dans dat$a
dat$b
et dat$c
et celle qui est la moyenne de chaque ligne pour dat$d
dat$e
et dat$f
.
Voici quelques exemples de données
dat <- data.frame( a = rnorm(16), b = rnorm(16), c = rnorm(16), d = rnorm(16), e = rnorm(16), f = rnorm(16))
a b c d e f
1 -0.9089594 -0.8144765 0.872691548 0.4051094 -0.09705234 -1.5100709
2 0.7993102 0.3243804 0.394560355 0.6646588 0.91033497 2.2504104
3 0.2963102 -0.2911078 -0.243723116 1.0661698 -0.89747522 -0.8455833
4 -0.4311512 -0.5997466 -0.545381175 0.3495578 0.38359390 0.4999425
5 -0.4955802 1.8949285 -0.266580411 1.2773987 -0.79373386 -1.8664651
6 1.0957793 -0.3326867 -1.116623982 -0.8584253 0.83704172 1.8368212
7 -0.2529444 0.5792413 -0.001950741 0.2661068 1.17515099 0.4875377
8 1.2560402 0.1354533 1.440160168 -2.1295397 2.05025701 1.0377283
9 0.8123061 0.4453768 1.598246016 0.7146553 -1.09476532 0.0600665
10 0.1084029 -0.4934862 -0.584671816 -0.8096653 1.54466019 -1.8117459
11 -0.8152812 0.9494620 0.100909570 1.5944528 1.56724269 0.6839954
12 0.3130357 2.6245864 1.750448404 -0.7494403 1.06055267 1.0358267
13 1.1976817 -1.2110708 0.719397607 -0.2690107 0.83364274 -0.6895936
14 -2.1860098 -0.8488031 -0.302743475 -0.7348443 0.34302096 -0.8024803
15 0.2361756 0.6773727 1.279737692 0.8742478 -0.03064782 -0.4874172
16 -1.5634527 -0.8276335 0.753090683 2.0394865 0.79006103 0.5704210
Je suis à quelque chose comme ceci
X1 X2
1 -0.28358147 -0.40067128
2 0.50608365 1.27513471
3 -0.07950691 -0.22562957
4 -0.52542633 0.41103139
5 0.37758930 -0.46093340
6 -0.11784382 0.60514586
7 0.10811540 0.64293184
8 0.94388455 0.31948189
9 0.95197629 -0.10668118
10 -0.32325169 -0.35891702
11 0.07836345 1.28189698
12 1.56269017 0.44897971
13 0.23533617 -0.04165384
14 -1.11251880 -0.39810121
15 0.73109533 0.11872758
16 -0.54599850 1.13332286
qui je l'ai fait avec cela, mais elle est évidemment pas bon pour ma beaucoup plus grand bloc de données...
data.frame(cbind(
apply(cbind(dat$a, dat$b, dat$c), 1, mean),
apply(cbind(dat$d, dat$e, dat$f), 1, mean)
))
J'ai essayé apply
et de boucles et ne peut pas tout à fait le faire ensemble. Mes données réelles a quelques centaines de colonnes.
source d'informationauteur Ben
Vous devez vous connecter pour publier un commentaire.
Cela peut être plus généralisables à votre situation que vous passez une liste d'indices. Si la vitesse est un problème (gros bloc de données), j'aurais opter pour
lapply
avecdo.call
plutôt quesapply
:Fonctionne si vous avez juste le col noms de trop:
MODIFIER
Juste arrivé à penser que peut-être vous souhaitez automatiser ce faire, tous les trois colonnes. Je sais qu'il ya une meilleure façon, mais ici on est sur un 100 de la colonne de l'ensemble de données:
EDIT 2
Toujours pas heureux avec l'indexation. Je pense qu'il y a un mieux, plus rapide façon de passer l'index. voici une seconde si pas de méthode satisfaisante:
moyenne pour les lignes à partir de vecteurs a,b,c
signifie pour les lignes à partir de vecteurs d,e,f
tout en un appel, vous recevrez
si vous ne connaissez que le nom des colonnes et non de l'ordre, alors vous pouvez utiliser:
Une question semblable a été posée ici par @david: en moyenne tous les 16 colonnes dans la r (maintenant fermé), auxquelles j'ai répondu par l'adaptation @TylerRinker la réponse ci-dessus, à la suite d'une suggestion faite par @joran et @Ben. Parce que la fonction obtenue peut être de l'aide à l'OP ou futurs lecteurs, je copie cette fonction ici, avec un exemple pour des OP de données.
Ensuite, pour trouver la moyenne de la réplique:
Ou, peut-être l'écart-type de la réplique:
Mise à jour
by
peut également être spécifié comme un vecteur de groupes:La
rowMeans
solution sera plus rapide, mais pour être complet voici comment vous pouvez faire cela avecapply
:Inspiré par @joran la suggestion, je suis venu avec ce (en fait un peu différent de ce qu'il a suggéré que, bien que la transposition de la suggestion a été particulièrement utile):
Faire un bloc de données de données, par exemple avec
p
cols pour simuler réaliste d'un ensemble de données (suivant @TylerRinker la réponse ci-dessus, et contrairement à mon mauvais exemple dans la question)Renommer les colonnes de ce bloc de données pour créer des groupes de
n
colonnes consécutives, de sorte que si je suis intéressé dans les groupes de trois colonnes-je obtenir les noms de colonnes comme 1,1,1,2,2,2,3,3,3, etc., ou si je voulais groupes de quatre colonnes, il serait 1,1,1,1,2,2,2,2,3,3,3,3, etc. Je vais avec trois pour l'instant (je suppose que c'est une sorte d'indexation pour les gens comme moi qui ne savent pas beaucoup au sujet de l'indexation)Maintenant utiliser appliquer et tapply pour obtenir de ligne moyen pour chacun des groupes
Les principaux inconvénients sont que les noms de colonne dans les données d'origine sont remplacées (bien que ce problème pourrait être surmonté par la mise le regroupement des nombres dans une nouvelle ligne plutôt que de la colnames) et que les noms de colonnes sont retournées par la demande-tapply de la fonction dans un peu serviable commande.
Encore à @joran la suggestion, voici un
data.table
solution:Merci à tous pour votre rapide et patients efforts!
Il y a une belle solution la plus simple si vous êtes intéressé par l'application d'une fonction pour chaque combinaison unique de colonnes, dans ce connu que la combinatoire.
Pour calculer les statistiques pour chaque combinaison unique de trois colonnes, etc., il suffit de changer les 2 à 3. L'opération est vectorisé et donc plus rapide que des boucles, comme le
apply
la famille de fonctions que ci-dessus. Si l'ordre des colonnes questions, alors vous avez plutôt besoin d'un algorithme de permutation conçu pour reproduire les ensembles ordonnés:combinat::permn