簡體   English   中英

R dplyr-根據特定值在另一列中的位置從一列中選擇值

[英]R dplyr - select values from one column based on position of a specific value in another column

我正在處理步態周期數據。 我為每個ID和步態試驗標記了8個事件。 在每個試驗中,“ LFCH”和“ RFCH”值出現兩次,因為它們代表從左腿和右腿開始的步態周期的開始和結束。

樣本數據框:

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

我很想創造像

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

我當前的代碼解決了這個問題,但是取決於Frame值的位置,而不是Mark中的實際值。 任何不遵循正常步態模式的人,其代碼都會產生錯誤的值。

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)

您可以通過幫助我將例如Frame [4]更改為類似Frame [Marks ==“ LFCH”的代碼來幫助我使代碼更穩定嗎?

如果兩個LFCHRFCH發生兩次完全相同,可以過濾,然后用diffsummarize

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

我們可以使用dplyr包中的firstlast

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM