1
votes

Vous recherchez plusieurs chaînes dans dataframe, de bas en haut si conditionnelle?

J'ai un dataframe avec plusieurs colonnes, appelons-le dat1, et j'ai besoin d'extraire des chaînes dans certaines colonnes en fonction de nombreuses conditions. Il y a environ 350 lignes par sujet, et j'ai besoin de trouver le dernier d'une certaine chaîne dans une certaine colonne, par sujet, contenant un certain nom, par exemple "vert" et prenez la valeur d'une autre chaîne de la même ligne.

last_green    before_last_green
   493          492
   583          459

Disons que j'ai besoin de la dernière valeur de "vert" pour chaque sujet, comment puis-je faire cela?

Après cela, je dois également obtenir la valeur qui est au-dessus du dernier "vert", de préférence en les enregistrant dans deux vecteurs séparés.

subject   type    value
111       yellow   354
111       green    584
111       yellow   584
111       blue     492
111       green    493
222       blue     459
222       green    583
222       yellow   539
222       blue     392
222       yellow   394

J'ai essayé de faire plusieurs déclarations if tout en les regroupant par sujet, mais sans même obtenir presque réussir. Je n'ai pas non plus été en mesure de trouver d'exemples de cela auparavant.

Est-il possible de rechercher le premier "vert" en bas de chaque sujet? Ou comment cela peut-il être réalisé autrement?


0 commentaires

3 Réponses :


0
votes

Code[p> Le tidyverse est votre ami:

library(tidyverse)
d <- structure(list(subject   = c(111L, 111L, 111L, 111L, 111L, 
                                  222L, 222L, 222L, 222L, 222L), 
                    type      = c("yellow", "green", "yellow", "blue", "green",
                                  "blue", "green", "yellow", "blue", "yellow"), 
                    value     = c(354L, 584L, 584L, 492L, 493L, 
                                  459L, 583L, 539L, 392L, 394L)), 
                    row.names = c(NA, -10L), 
                    class = c("tbl_df", "tbl", "data.frame"))

d %>% 
  group_by(subject) %>% 
  filter(type == "green") %>% 
  summarise_all(last)

# A tibble: 2 x 3
#   subject type  value
#     <int> <chr> <int>
# 1     111 green   493
# 2     222 green   583

Explication

  • avec group_by , vous effectuerez les opérations suivantes par valeur unique de subject
  • avec filtre vous recherchez uniquement les lignes avec type égal à vert
  • avec récapituler vous ne sélectionnez finalement que la dernière entrée


0 commentaires

0
votes

Répondre aux deux questions:

> last_green
[1] 493 583
> before_last_green
[1] 492 459

Créer un filtre df:

filter_=df%>%rownames_to_column()%>%group_by(subject)%>%
  filter(type=="green")%>%slice(n())

last_green=filter_$value
before_last_green=df$value[as.numeric(filter_$rowname)-1]

Résultats:

df=data.frame("subject"=c(rep(111,5),rep(222,5)),
           "type"=c("yellow","green","yellow","blue","green",
                    "blue","green","yellow","blue","yellow"),
           value=c(354,584,584,492,493,459,583,539,392,394),
           stringsAsFactors = FALSE)
   subject   type value
1      111 yellow   354
2      111  green   584
3      111 yellow   584
4      111   blue   492
5      111  green   493
6      222   blue   459
7      222  green   583
8      222 yellow   539
9      222   blue   392
10     222 yellow   394


2 commentaires

Merci! Alors que j'adapte cela à mes données réelles, lorsque je lance filter_ = df%>% rownames_to_column ()%>% group_by (subject)%>% filter (type == "green")%>% slice (n ( )) J'obtiens cette erreur Erreur dans filter_impl (.data, quo): Erreur d'évaluation: objet 'type' non trouvé. Je sais que la colonne se compose de chaînes et non de facteurs, donc cela ne devrait pas être le problème. Est-ce quelque chose dont vous avez besoin d'un package spécifique à exécuter que je ne peux pas déterminer lequel?


J'utilise uniquement library (tibble) et library (dplyr) . Attention aux autres fonctions de masquage des bibliothèques.



0
votes

Vous pouvez le faire de cette façon:

dat <- read.table(
  text = "subject   type    value
111       yellow   354
111       green    584
111       yellow   584
111       blue     492
111       green    493
222       blue     459
222       green    583
222       yellow   539
222       blue     392
222       yellow   394",
  header = T, stringsAsFactors = F
)

Que se passe-t-il ici:

  • vous déplacez les noms de domaine de votre data.frame dans la variable rowname (voir pourquoi);
  • vous regroupez vos données par sujet , pour appliquer les opérations suivantes sur des sous-ensembles de vos données, liés à un sujet particulier;
  • vous filtrez vos données en ne laissant que les verts ;
  • et enfin:
    • vous récapitulez vos données, en prenant la dernière valeur pour chaque sous-ensemble précédemment filtré et en l'attribuant à value_green ;
    • vous empruntez l'intégralité de votre dat non transformée à l'environnement, en sous-définissant la valeur du dat par des lignes correspondant au dernier ( ronwame) - 1 de vos données . , c'est-à-dire des données qui sont entrées dans summary via les tuyaux.

Qui correspond à:

# A tibble: 2 x 3
  subject last_green before_last_green
    <int>      <int>             <int>
1     111        493               492
2     222        583               459

Vos données:

library(tidyverse)

dat %>%
  rownames_to_column() %>%
  group_by(subject) %>%
  filter(type == 'green') %>%
  summarise(
    last_green        = last(value), 
    before_last_green = dat$value[as.numeric(last(rowname)) - 1]
    )


0 commentaires