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?
3 Réponses :
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
group_by , vous effectuerez les opérations suivantes par valeur unique de subject filtre vous recherchez uniquement les lignes avec type égal à vert récapituler vous ne sélectionnez finalement que la dernière entrée 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
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.
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:
data.frame dans la variable rowname (voir pourquoi); sujet , pour appliquer les opérations suivantes sur des sous-ensembles de vos données, liés à un sujet particulier; filtrez vos données en ne laissant que les verts ; 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 ; 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]
)