Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为每个唯一id计算R中日期之间的差异_R - Fatal编程技术网

如何为每个唯一id计算R中日期之间的差异

如何为每个唯一id计算R中日期之间的差异,r,R,我是R新手,拥有以下产品的用户名及其使用日期数据(截断输出): 我想对日期之间的差异做一些分析,特别是每个用户使用之间的天数。我想画一个直方图来确定用户之间是否存在某种模式 如何计算R中每个用户的日期差 除了直方图之外,我还应该探索其他可视化方法吗 谢谢假设您的数据帧是df,请尝试此操作: ## in case you have different column names colnames(df) <- c("Name", "Date") ## you might also have

我是R新手,拥有以下产品的用户名及其使用日期数据(截断输出):

我想对
日期
之间的差异做一些分析,特别是每个用户使用之间的天数。我想画一个直方图来确定用户之间是否存在某种模式

  • 如何计算R中每个用户的日期差
  • 除了直方图之外,我还应该探索其他可视化方法吗

  • 谢谢

    假设您的数据帧是
    df
    ,请尝试此操作:

    ## in case you have different column names
    colnames(df) <- c("Name", "Date")
    
    ## you might also have Date as factors when reading in data
    ## the following ensures it is character string
    df$Date <- as.character(df$Date)
    
    ## convert to Date object
    ## see ?strptime for various available format
    ## see ?as.Date for Date object
    df$Date <- as.Date(df$Date, format = "%m-%d-%Y %H:%M:%S")
    
    ## reorder, so that date are ascending (see Jane)
    ## this is necessary, otherwise negative number occur after differencing
    ## see ?order on ordering
    df <- df[order(df$Name, df$Date), ]
    
    ## take day lags per person
    ## see ?diff for taking difference
    ## see ?tapply for applying FUN on grouped data
    ## as.integer() makes output clean
    ## if unsure, compare with: lags <- with(df, tapply(Date, Name, FUN = diff))
    lags <- with(df, tapply(Date, Name, FUN = function (x) as.integer(diff(x))))
    
    lags
    是一个列表。如果要获取Jane的信息,请执行
    延迟$Jane
    。要获得直方图,请执行
    hist(滞后$Jane)
    。此外,如果您只想为所有客户机生成一个直方图,忽略个别差异,请使用
    hist(unlist(lags))
    unlist()


    评论:

  • 关于您对参考R的要求,请参见和
  • 对多个索引使用
    tapply
    ?也许你可以试试我的技巧,使用
    paste
    首先构造一个辅助索引
  • 呃,看起来我很快就把事情弄复杂了,通过使用密度和中心极限定理等来可视化。所以我删除了我的另一个答案

  • 我们可以使用
    data.table
    lubridate

    library(lubridate)
    library(data.table)
    setDT(df1)[order(mdy_hms(Date)),  .(Diff=as.integer(diff(as.Date(mdy_hms(Date))))), Name]
    #    Name Diff
    #1: Mary    0
    #2: Mary    1
    #3: Jane    1
    
    如果存在多个分组变量,即“ID”,我们可以通过

    setDT(df1)[order(mdy_hms(Date)),  .(Diff=as.integer(diff(as.Date(mdy_hms(Date))))), 
                                            by = .(Name, ID)]
    

    您能否显示您的预期输出(至少是数据),以及您在上面给出的数据中使用的顺序?非常感谢李哲远的详细解释,按照您的说明和提示查找函数非常容易李哲远:如果我有另一列“Id”,我想应用Diff函数,我能打电话给tapply(日期、姓名、身份证、乐趣=…)吗?我想应用这个函数,但在多栏上我之前不清楚。我希望能够将姓名和身份证视为一个组合。只有在名称和ID相同的情况下才有区别,Tapply仍然是正确的函数?啊,这是一个很好的技巧。你是一位伟大的老师。你能推荐一些关于R的好书吗?我还有最后一个后续问题。假设我想要所有用户的差异直方图。使用下面描述的库Akrun会更容易吗?
    library(lubridate)
    library(data.table)
    setDT(df1)[order(mdy_hms(Date)),  .(Diff=as.integer(diff(as.Date(mdy_hms(Date))))), Name]
    #    Name Diff
    #1: Mary    0
    #2: Mary    1
    #3: Jane    1
    
    setDT(df1)[order(mdy_hms(Date)),  .(Diff=as.integer(diff(as.Date(mdy_hms(Date))))), 
                                            by = .(Name, ID)]