J'ai des données où j'ai un élément d'intérêt (111) dans une colonne. Mes données ressemblent à ceci:
pcp2 <- data.frame(A = c(rep(111, 4), rep(222, 5), rep(111,5),
rep(222,5)),B= c(rep(1,9), rep(2,10)))
A B
1 111 1
2 111 1
3 111 1
4 111 1
5 222 1
6 222 1
7 222 1
8 222 1
9 222 1
10 111 2
11 111 2
12 111 2
13 111 2
14 111 2
15 222 2
16 222 2
17 222 2
18 222 2
19 222 2
Je veux réduire la totalité de la seule variable 222 et laisser tous les 111 intacts dans mes données en fonction des identifiants de la colonne B comme suit:
A B
1 111 1
2 111 1
3 111 1
4 111 1
5 222 1
6 111 2
7 111 2
8 111 2
9 111 2
10 111 2
11 222 2
Tout ce que j'ai pu trouver qui est proche réduit toutes les variables (111 et 222).
library(data.table)
dat <- as.data.table(pcp2, key = "B")
data <- dat[, by = key(dat)][!duplicated(A == "222")]
comme suit:
A B
1 111 1
2 222 2
J'ai joué avec diverses itérations de ce code et d'autres, mais d'autres choses que j'ai essayées viennent de ramener mes données à deux lignes ou de réduire à la fois 111 et 222. Cela ne serait pas suffisant:
A B
1 111 1
2 222 2
3 111 2
4 222 2
Quelqu'un a-t-il des conseils sur la façon dont vous maintiendriez le 111 et réduiriez le 222 dans une colonne en fonction d'une autre colonne comme l'exemple (B dans ce cas)? Je sais que d'autres exemples sont similaires, mais aucun ne semble donner la possibilité de spécifier de ne pas réduire une variable particulière dans une colonne tout en réduisant la ou les autres.
Voici une dplyr
solution utilisant slice
. Cette solution ne suppose pas que les autres valeurs de A
autre que 111
sont 222
:
library(dplyr)
pcp2 %>%
group_by(B, A) %>%
slice(if(any(A == "111")) 1:n() else 1)
Alternativement en utilisant data.table
:
library(data.table)
setDT(pcp2)[, .I[if(any(A=="111")) 1:.N else 1], by = c("B", "A")][,.SD, .SDcols = A:B]
Résultat:
# A tibble: 12 x 2
# Groups: B, A [5]
A B
<dbl> <dbl>
1 111 1
2 111 1
3 111 1
4 111 1
5 222 1
6 111 2
7 111 2
8 111 2
9 111 2
10 111 2
11 222 2
12 333 2
A B
1: 111 1
2: 111 1
3: 111 1
4: 111 1
5: 222 1
6: 111 2
7: 111 2
8: 111 2
9: 111 2
10: 111 2
11: 222 2
12: 333 2
Les données:
pcp2 <- data.frame(A = c(rep(111, 4), rep(222, 5), rep(111,5),
rep(222,5), rep(333, 5)), B= c(rep(1,9), rep(2,10), rep(2, 5)))
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots