【问题标题】:R dplyr - select values from one column based on position of a specific value in another columnR dplyr - 根据另一列中特定值的位置从一列中选择值
【发布时间】:2017-12-06 23:09:01
【问题描述】:

我正在处理步态周期数据。我为每个 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 值的位置,而不是 Marks 中的实际值。任何不遵循正常步态模式的人都会得到代码产生的错误值。

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" last time ]?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    如果LFCHRFCH 恰好出现两次,您可以过滤然后在summarize 中使用diff

    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
    

    【讨论】:

      【解决方案2】:

      我们可以使用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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-23
        • 2020-04-22
        • 1970-01-01
        • 2022-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多