2017-12-06 2 views
0

Ich arbeite mit Gangzyklusdaten. Ich habe 8 Ereignisse für jeden ID- und Gangversuch markiert. Die Werte "LFCH" und "RFCH" treten bei jedem Versuch zweimal auf, da diese den Beginn und das Ende der Gangzyklen vom linken und rechten Bein darstellen.R dplyr - wähle Werte aus einer Spalte basierend auf der Position eines bestimmten Wertes in einer anderen Spalte

Beispieldatenrahmen:

df <- data.frame(ID = rep(1:5, each = 16), 
       Gait_nr = rep(1:2, each = 8, times=5), 
       Frame = rep(c(1,5,7,9,10,15,22,25), times = 10), 
       Marks = rep(c("LFCH", "LHL", "RFCH", "LTO", "RHL", "LFCH", "RTO", "RFCH"), times =10) 

head(df,8) 
    ID Gait_nr Frame Marks 
1 1  1  1 LFCH 
2 1  1  5 LHL 
3 1  1  7 RFCH 
4 1  1  9 LTO 
5 1  1 10 RHL 
6 1  1 15 LFCH 
7 1  1 22 RTO 
8 1  1 25 RFCH 

I Wold

Total_gait_left = Frame[The last time Marks == "LFCH"] - Frame[The first time Marks == "LFCH"] 

Mein aktueller Code, um das Problem, wie etwas zu schaffen, wie löst, aber auf der Position der Rahmenwerte hängt eher als die tatsächlichen Werte in Marken. Jede Person, die nicht dem normalen Gangmuster folgt, hat falsche Werte, die durch den Code erzeugt werden.

library(tidyverse) 
l <- df %>% group_by(ID, Gait_nr) %>% filter(grepl("L.+", Marks)) %>% 
    summarize(Total_gait = Frame[4] - Frame[1], 
      Side = "left") 

r <- df %>% group_by(ID, Gait_nr) %>% filter(grepl("R.+", Marks)) %>% 
    summarize(Total_gait = Frame[4] - Frame[1], 
      Side = "right") 

val <- union(l,r, by=c("ID", "Gait_nr", "Side")) %>% arrange(ID, Gait_nr, Side) 

Können Sie mir helfen, meinen Code stabiler zu machen, indem Sie mir helfen, z. Frame [4] zu etwas wie Frame [Marks == "LFCH" beim letzten Mal]?

Antwort

2

Wenn beide LFCH und RFCH passieren genau zweimal, können Sie auswählen, und verwenden Sie dann diff in summarize:

df %>% 
    group_by(ID, Gait_nr) %>% 
    summarise(
     left = diff(Frame[Marks == 'LFCH']), 
     right = diff(Frame[Marks == 'RFCH']) 
    ) 

# A tibble: 10 x 4 
# Groups: ID [?] 
#  ID Gait_nr left right 
# <int> <int> <dbl> <dbl> 
# 1  1  1 14 18 
# 2  1  2 14 18 
# 3  2  1 14 18 
# 4  2  2 14 18 
# 5  3  1 14 18 
# 6  3  2 14 18 
# 7  4  1 14 18 
# 8  4  2 14 18 
# 9  5  1 14 18 
#10  5  2 14 18 
1

Wir können first und last aus dem dplyr Paket verwenden.

library(dplyr) 

df2 <- df %>% 
    filter(Marks %in% "LFCH") %>% 
    group_by(ID, Gait_nr) %>% 
    summarise(Total_gait = last(Frame) - first(Frame)) %>% 
    ungroup() 
df2 
# # A tibble: 10 x 3 
#  ID Gait_nr Total_gait 
# <int> <int>  <dbl> 
# 1  1  1   14 
# 2  1  2   14 
# 3  2  1   14 
# 4  2  2   14 
# 5  3  1   14 
# 6  3  2   14 
# 7  4  1   14 
# 8  4  2   14 
# 9  5  1   14 
# 10  5  2   14 
Verwandte Themen