J'ai un bloc de données comme celui-ci:
block prSwitch of p1/p2 1 0.06666667 2 0.03333333 3 0.10000000 4 0.06666667 5 0.10000000 6 0.06666667
Je voudrais diviser chaque ligne avec p1 avec celle avec p2 dans le même bloc et cela pour chaque bloc.
J'aimerais que mon nouveau df ressemble à ceci:
block partner prSwitch 1 p1 0.06666667 1 p2 0.06666667 2 p1 0.03333333 2 p2 0.06666667 3 p1 0.10000000 3 p2 0.06666667 4 p1 0.06666667 4 p2 0.03333333 5 p1 0.10000000 5 p2 0.13333333 6 p1 0.06666667 6 p2 0.23333333
Merci!
3 Réponses :
Utilisation de dplyr:
library(dplyr) your_data %>% group_by(block) %>% summarize(prSwitch_p1_p2_ratio = prSwitch[partner == "p1"] / prSwitch[partner == "p2"])
Cela générera une erreur si vous n'avez pas un seul p1 et p2 dans un bloc.
Dans Base R, nous pourrions utiliser ce
new_df <- data.frame(
block = unique(df$block),
"prSwitch of p1/p2" = sapply(split(df, df$block), function(x) x$prSwitch[1] / x$prSwitch[2])
)
> new_df
block prSwitch.of.p1.p2
1 1 1.0000000
2 2 0.4999999
3 3 1.4999999
4 4 2.0000003
5 5 0.7500000
6 6 0.2857143
Remodelez vos données en grand format. Cela fonctionnera également très bien s'il manque une valeur p1 ou p2.
DF <- read.table(text = "block partner prSwitch 1 p1 0.06666667 1 p2 0.06666667 2 p1 0.03333333 2 p2 0.06666667 3 p1 0.10000000 3 p2 0.06666667 4 p1 0.06666667 4 p2 0.03333333 5 p1 0.10000000 5 p2 0.13333333 6 p1 0.06666667 6 p2 0.23333333", header = TRUE) library(reshape2) DF1 <- dcast(DF, block ~ partner) DF1$quotient <- DF1$p1 / DF1$p2 # block p1 p2 quotient #1 1 0.06666667 0.06666667 1.0000000 #2 2 0.03333333 0.06666667 0.4999999 #3 3 0.10000000 0.06666667 1.4999999 #4 4 0.06666667 0.03333333 2.0000003 #5 5 0.10000000 0.13333333 0.7500000 #6 6 0.06666667 0.23333333 0.2857143