在不同的行和列上减去并按组分隔

rj2*_*700 5 r dataframe

我真的不想连续问两个问题,但这是我无法解决的问题.所以假设我有一个数据框,如下所示:

   df
   Row# User    Morning     Evening     Measure Date
   1    1          NA          NA          2/18/11
   2    1          50          115         2/19/11
   3    1          85          128         2/20/11
   4    1          62          NA          2/25/11
   5    1          48          100.8        3/8/11
   6    1          19          71          3/9/11
   7    1          25          98          3/10/11
   8    1          NA          105         3/11/11
   9    2          48          105         2/18/11
   10   2          28          203         2/19/11
   11   2          35          80.99        2/21/11
   12   2          91          78.25        2/22/11
Run Code Online (Sandbox Code Playgroud)

是否可以在R中获取前一个连续日(并且前一天,而不是前一个结果)的晚上值1行和每个用户组的不同行的早晨值之间的差异?所以我想要的结果就是这样.

   df
   Row# User    Morning     Evening     Date        Difference
   1       1      NA          NA        2/18/11        NA
   2       1      50          115       2/19/11        NA
   3       1      85          129       2/20/11        30
   4       1      62          NA        2/25/11        NA
   5       1      48          100.8     3/8/11         NA
   6       1      19          71        3/9/11         81.8
   7       1      25          98        3/10/11        46
   8       1      10          105       3/11/11        88
   9       2      48          105       2/18/11        NA
   10      2      28          203       2/19/11        77
   11      2      35          80.99     2/21/11        NA
   12      2      91          78.25     2/22/11        -10.01
Run Code Online (Sandbox Code Playgroud)

我想要做的就是取早上的值并从每个用户组的前一个连续日的晚值中减去它.正如您所看到的,我的数据框的某些部分在早晨和晚上的列中包含NA值,此外,并非所有日期都是每个不同用户的连续顺序,因此自然应该分配NA.

我试过搜索谷歌,但没有太多信息可以将功能应用于不同列上的每组行的不同行(如果这是有道理的).

我的尝试包括许多变化.

df$Difference<-ave((df$Morning,df$Evening),
                    df$User,
                    FUN=function(x){
                        c('NA',diff(df$Evening-df$Morning)),na.rm=T
                   })
Run Code Online (Sandbox Code Playgroud)

再次,任何帮助将不胜感激.谢谢.

Aru*_*run 4

注意:您显示的输入数据和输出数据并不相同。有一个NA被替换为10in 输出,最后一个日期2/14/11在输入和2/22/11输出中。

我假设输出是原始数据,以创建此答案以匹配您的结果。

df$Diff <- c(NA, head(df$Evening, -1) - tail(df$Morning, -1))
df$Diff[which(c(0, diff(as.Date(as.character(df$Measure_Date), 
                 format="%m/%d/%Y"))) != 1)] <- NA

> df

#    Row User Morning Evening Measure_Date   Diff
# 1    1    1      NA      NA      2/18/11     NA
# 2    2    1      50  115.00      2/19/11     NA
# 3    3    1      85  128.00      2/20/11  30.00
# 4    4    1      62      NA      2/25/11     NA
# 5    5    1      48  100.80       3/8/11     NA
# 6    6    1      19   71.00       3/9/11  81.80
# 7    7    1      25   98.00      3/10/11  46.00
# 8    8    1      10  105.00      3/11/11  88.00
# 9    9    2      48  105.00      2/18/11     NA
# 10  10    2      28  203.00      2/19/11  77.00
# 11  11    2      35   80.99      2/21/11     NA
# 12  12    2      91   78.25      2/22/11 -10.01
Run Code Online (Sandbox Code Playgroud)

@user1342086 的编辑(被拒绝,但确实是正确的):

df$Diff[which(diff(df$User) != 0)] <- NA
Run Code Online (Sandbox Code Playgroud)

似乎负责按“用户”进行分组。