2016-05-20 7 views
0

私は以前の質問(Difference between dates in many columns in R)に答えようとしています。私は、特定の列と、すぐに残っている列との間の時間差だけを必要としていることを認識しました。説明のための例:隣の列の日付の時差R

df <- data.frame(
    Group=c("A","B"), 
    ID=c(1,2), 
    Date1=as.POSIXct(c('2016-04-25 09:15:29','2016-04-25 09:15:29')), 
    Date2=as.POSIXct(c('2016-04-25 14:01:19','2016-04-25 14:01:19')), 
    Date3=as.POSIXct(c('2016-04-26 13:28:19','2016-04-26 13:28:19')), 
    stringsAsFactors=F 
) 

希望する出力は、Date2-Date1とDate3-Date2で​​す。もちろん、これは多くの列、つまりDate4-Date3などに拡張されますが、Date3-Date1は必要ありません。これを自動化するにはどうすればいいですか?

df$Date2_Date1 <- difftime(df$Date2,df$Date1, units = c("hours")) 
df$Date3_Date2 <- difftime(df$Date3,df$Date2, units = c("hours")) 

元の回答は@bgoldstに感謝します。

cmb <- combn(seq_len(ncol(df)-1L)+1L,2L); 
res <- abs(apply(cmb,2L,function(x) difftime(df[[x[1L]]],df[[x[2L]]],units='hours'))); 
colnames(res) <- apply(cmb,2L,function(x,cns) paste0(cns[x[1L]],'_',cns[x[2L]]),names(df)) 

おかげ

答えて

2

あなたの例を考えると、このべきトリックへ:

df <- data.frame(
    Group=c("A","B"), 
    ID=c(1,2), 
    Date1=as.POSIXct(c('2016-04-25 09:15:29','2016-04-25 09:15:29')), 
    Date2=as.POSIXct(c('2016-04-25 14:01:19','2016-04-25 14:01:19')), 
    Date3=as.POSIXct(c('2016-04-26 13:28:19','2016-04-26 13:28:19')), 
    stringsAsFactors=F 
) 
mapply(difftime, df[, 4:5], df[, 3:4], units = "hours") 

>日付2 Date3
> [1、] 4.763889 23.45
> [2、] 4.763889 23.45

私の電話でmapplyが適用されますつの配列にがあるので、df[, 4] - df[, 3]で始まり、次にdf[, 5] - df[, 4]で始まります。もちろん、日付の列番号を使ってこれを変更し、正しい順序で並べられていることを確認する必要があります。

幸運を祈る!

+0

適切な列を 'which'で見つけて、単純にdata.frameを上下に加算/減算することで隣接する列を計算することができます。 –

+0

ありがとうジャスパー、これは非常にうまくいった。 Roman、少し試してみるといいですか? – Pete900

1

あなたが使用できる非標準評価:

  1. まずあなたと文字ベクトルを作成し、私はちょうど正しい配列を有することを下記のCMBを適応させる必要があると思います日付を含む列の名前。

    all_operations = lapply(seq_len(length(dates) - 1), function(i){ 
        as.formula(paste("~difftime(", dates[i + 1], ",", dates[i],", units = c('hours'))")) 
    }) 
    

    これは、数式を作成します:

    だから、私たちは、動的に隣接する列の間の差を計算する式のリストを作成日 『

    dates = names(df)[grepl("^Date", names(df))] 
    
  2. 」で始まるすべての列を言う』しましょう

    [[1]]: ~difftime(Date2, Date1, units = c("hours")) 
    [[2]]: ~difftime(Date3, Date2, units = c("hours")) 
    
  3. は、その後、あなたはdplyrは、上記生成された動的な数式を適用するNSE mutate_を使用することができます

    df %>% 
        mutate_(.dots = setNames(all_operations, paste0("Diff", seq_len(length(dates) - 1)))) 
    
+0

ありがとうLorenzo。私は2つの答えを受け入れることができたらいいなあこれも非常にうまくいった!私がJaspersを受け入れた唯一の理由は、私がそれをもっと理解したためであり、それはおそらく正当な理由ではないでしょう。 – Pete900