r - 在不同的行和列上相减并按组分隔

标签 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

在 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

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

我试过搜索谷歌,但没有太多关于能够将函数应用于不同列上的每组行的不同行的信息(如果有任何意义的话)。

我的尝试包括这方面的许多变体。
df$Difference<-ave((df$Morning,df$Evening),
                    df$User,
                    FUN=function(x){
                        c('NA',diff(df$Evening-df$Morning)),na.rm=T
                   })

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

最佳答案

盲目的第一枪(未经测试)。依赖于已按用户和日期排序的数据框。

#if necessary, transform your dates from factor to Date
df$Date <- as.Date(levels(df$Date)[df$Date],format="%m/%d/%y")

df <- within(df, 
  Difference <- ifelse(c(NA,diff(Measure_Date)) == 1 & diff(User) == 0, 
    c(NA,head(Evening,-1)) - Morning, NA
  )
)

关于r - 在不同的行和列上相减并按组分隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15089457/

相关文章:

python - Pandas:从数据框的行中获取标签并将其转换为列名

r - 使用二进制值格式化 data.frame

R:如何计算 1 的个数并写入向量

r - 当没有非 NA 值时,汇总不会从最大值返回警告

r - 使用 choroplethr 包时出错

r - 如何通过 http 共享 'r' 图

r - 使用 dplyr 添加多列并根据条件填充单元格

python - 如何根据值在另一个数据框中的位置获取一个数据框中的值

python - 如何根据另一列添加到 Pandas 列

python - 从python中的txt文件中绘制选定的值