根据R中数据集中较低的观察值创建变量

根据R中数据集中较低的观察值创建变量,r,R,我需要创建一个新的变量,该变量基于数据集中更深层次的观察信息,该信息符合特定标准。这些标准可以在下一次观察中得到满足,也可以向下几行 我是R的初学者,在解决方案上还没有取得任何进展 我有一个包含以下变量的数据帧(df): event event time pass 10.10 failed block 10.20 failed check 10.21 reception 10.25 pass 17.60

我需要创建一个新的变量,该变量基于数据集中更深层次的观察信息,该信息符合特定标准。这些标准可以在下一次观察中得到满足,也可以向下几行

我是R的初学者,在解决方案上还没有取得任何进展

我有一个包含以下变量的数据帧(df):

event        event time  
pass            10.10  
failed block    10.20
failed check    10.21  
reception       10.25
pass            17.60
reception       17.65
我需要创建一个名为Receivement time的变量,该变量返回每次传递的接收时间,因此它看起来像:

event         event time   reception time  
pass            10.10          10.25  
failed block    10.20            NA
failed check    10.21            NA  
reception       10.25            NA  
pass            17.60          17.65  
reception       17.65            NA
在通行证和接待处之间可能有50条或更多的线路。

欢迎来到Stack

这有点不清楚,但它适用于您的示例

df1

为管道使用包
dplyr
,为
fill使用包
tidyr

代码

library(dplyr)
library(tidyr)

df2 <- df1 %>% 
  mutate(reception.time = ifelse(event == "reception", event.time, NA)) %>% 
  fill(reception.time, .direction = "up") %>% 
  mutate(reception.time = ifelse(event == "pass", reception.time, NA)
数据

dput(df1)


df1您可以使用
base
R
的功能实现所需的功能,前提是:

  • 您的数据帧总是以
    通过开始(即
    通过
    发生在
    接收之前)
  • 随后在稍后时间点进行的每次
    接收
    均适用于前一次
    通过
  • 如果是这种情况(即,如果不是,请提供更多详细信息),则应:

    #定义变量。
    
    事件如果我正确理解您的数据,添加分组变量(例如
    event\n
    )可能有助于进一步分析

    如果
    接收
    始终是新系列事件之前的最后一次发生,则可以使用
    dplyr
    中的
    last()
    函数

    库(dplyr)
    df%
    突变(事件n=序列(n())%>%
    解组()
    df2
    #>#tibble:6 x 3
    #>事件时间事件
    #>                   
    #>1通过10.1 1
    #>2故障块10.2 1
    #>3检查失败10.2 1
    #>4接待10.2 1
    #>5通过17.6 2
    #>6接待17.6 2
    df2%>%
    分组依据(事件)%>%
    变异(接收=如果其他(事件=“通过”,最后(事件时间),不真实))
    #>#tibble:6 x 4
    #>#小组:活动[2]
    #>事件时间事件接收
    #>                        
    #>1通过10.1 10.2
    #>2故障块10.2 1 NA
    #>3检查失败10.2 1不适用
    #>4接收10.2 1不适用
    #>5通过17.6 2 17.6
    #>6接收17.6 2不适用
    
    由(v0.3.0)于2019-08-08创建


    这个答案是否适用于您的数据?

    在您的数据中,是否每个过程都有接收?(或者可能有拦截,或者其他什么?)如果每次传球都有接收,那么类似于
    df$receivement\u time=NA;df$接收时间[df$事件==“通过”]=df$事件时间[df$事件==“接收”]
    。但是,如果数据更复杂,这将不起作用。@Gregor我认为这应该可以很好地工作,只要数据以
    通过开始,并且总是在
    之后有
    接收
    。@Mihai如果数据以
    通过开始并不重要-对我的方法起作用的是(a)传递和接收的数量相同,(b)它们的顺序相同(第一次传递与第一次接收相关,第二次传递与第二次接收相关,等等)。数据帧并不总是以传递开始(仔细想想,我认为它永远不会以一个开始)。在整个数据帧中可能会有500次左右的传递,但它们总是嵌入在中间的某个位置。它不必以
    传递开始,只要
    传递必须在
    接收之前发生,很高兴听到这一点。看起来你也很幸运,用不同的方法得到了几个答案。不要忘记阅读上的帮助中心部分。tl:dr-如果你觉得答案是有效的(即回答了你的问题),请向上投票,并确保在你认为最能回答你问题的答案旁边使用复选框。此外,请确保访问和。
    
    library(dplyr)
    library(tidyr)
    
    df2 <- df1 %>% 
      mutate(reception.time = ifelse(event == "reception", event.time, NA)) %>% 
      fill(reception.time, .direction = "up") %>% 
      mutate(reception.time = ifelse(event == "pass", reception.time, NA)
    
             event event.time reception.time
    1         pass      10.10          10.25
    2 failed block      10.20             NA
    3 failed check      10.21             NA
    4    reception      10.25             NA
    5         pass      17.60          17.65
    6    reception      17.65             NA
    
    df1 <- structure(list(event = c("pass", "failed block", "failed check", 
    "reception", "pass", "reception"), event.time = c(10.1, 10.2, 
    10.21, 10.25, 17.6, 17.65)), class = "data.frame", row.names = c(NA, 
    -6L))