2017-09-21 3 views
0

Je peux vraiment imaginer, que la réponse peut être trouvée à stackoverflow mais je ne le comprends pas. Voici donc ma question:R appliquer pour deux trames de données

J'ai un data.frame "tmp" qui se compose de 17 colonnes et de nombreuses lignes. Ce que je veux faire est d'utiliser la fonction environ avec les informations de ligne tmp par ligne en utilisant la fonction appliquer:

tmp[,17] <- apply(tmp[,4:16], 1, approx, y = y, x = tmp[,2])

où y est fix.

Mon problème est que j'obtiens maintenant une matrice n x n car la fonction apply calcule chaque paire de tmp[,4:16] et tmp[,2]. Ce que je besoin est juste la diagonale, à savoir

(tmp[1,4:16], tmp[1,2]), (tmp[2,4:16], tmp[2,2]), (tmp[3,4:16], tmp[3,2]),...

Et je veux éviter de faire des choses comme diag(apply(...)) ou une boucle, parce que je veux réduire le temps de calcul.

J'espère que quelqu'un peut me aider et je vous remercie beaucoup d'avance

+0

Est-ce possible? 'approx (tmp [1,4: 16], tmp [1,2])' throws 'Erreur dans xy.coords (x, y, setLab = FALSE): les longueurs 'x' et 'y' diffèrent'. –

+0

Vous avez besoin des nœuds dans la fonction approx: 'approx (y, tmp [1,4: 16], tmp [1,2])' où y a la même longueur de tmp [1,4: 16]. Dans ma fonction apply, j'ai tordu le 'y' et le' tmp [, 4: 16] 'et j'ai écrit une nouvelle fonction approx où j'ai placé les vecteurs dans le bon ordre donc complètement' tmp [, 17] <- apply (tmp [, 4: 16], 1, approx2, y = y, x = tmp [, 2]) 'avec fonction' approx2 <- (tmp, y, tmp2) {environ (y, tmp, tmp2) [[2] ]} ' – Chefkoch

Répondre

0

Est-ce que vous voulez? Notez que les deux tmp[, 4:16] et tmp[, 2] utilisent la même ligne i.

set.seed(4542) # make it reproducible 

tmp <- as.data.frame(matrix(rnorm(20*17), ncol = 17)) 
y <- rnorm(length(4:16)) 

s <- sapply(seq_along(tmp[, 1]), function(i) approx(y, tmp[i, 4:16], tmp[i, 2])) 

Au lieu de seq_along(tmp[, 1]) il est également possible d'utiliser seq_len(nrow(tmp)).

+0

C'est exactement ce que je voulais! Merci beaucoup! – Chefkoch

+0

Après avoir testé votre code (ça marche très bien!) J'ai une question. Pourquoi le temps système est-il plus élevé lorsque j'utilise votre code, puis que j'utilise mon code à partir de la question, cependant, je reçois n x n résultats et avec votre solution juste n résultats? – Chefkoch

+0

@Chefkoch Juste l'heure du système ou le temps total? –