1
votes

Division ligne par ligne en dessous en R

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!

r

0 commentaires

3 Réponses :


2
votes

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.


0 commentaires

0
votes

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


0 commentaires

0
votes

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


0 commentaires