基于日期的行以长格式划分

时间:2015-07-30 10:10:27

标签: r dataframe division

我有一个数据框:

df1 <- data.frame(Datum = as.Date(c("2015-01-01","2015-02-02","2015-03-03","2015-04-04","2015-05-05",
                                    "2015-02-02","2015-04-04","2015-01-01","2015-03-03","2015-05-05")), 
                  Par = c(rep("N",5),rep("P",5)), val = 10:1)

        Datum Par val
1  2015-01-01   N  10
2  2015-02-02   N   9
3  2015-03-03   N   8
4  2015-04-04   N   7
5  2015-05-05   N   6
6  2015-02-02   P   5
7  2015-04-04   P   4
8  2015-01-01   P   3
9  2015-03-03   P   2
10 2015-05-05   P   1

我想在同一日期用par = P的行对par = N的行进行除法,并将其添加到数据帧。预期结果应为:

        Datum Par       val
1  2015-01-01   N 10.000000
2  2015-02-02   N  9.000000
3  2015-03-03   N  8.000000
4  2015-04-04   N  7.000000
5  2015-05-05   N  6.000000
6  2015-02-02   P  5.000000
7  2015-04-04   P  4.000000
8  2015-01-01   P  3.000000
9  2015-03-03   P  2.000000
10 2015-05-05   P  1.000000
11 2015-01-01 N/P  3.333333
12 2015-02-02 N/P  1.800000
13 2015-03-03 N/P  4.000000
14 2015-04-04 N/P  1.750000
15 2015-05-05 N/P  6.000000

我知道我可以转换为宽格式(例如来自dcast的{​​{1}}),然后对列进行求和,并将它们粘贴到原始df1下,但这看起来有点复杂。 所以我的问题是,这可以用很长的格式完成吗?

1 个答案:

答案 0 :(得分:3)

使用已编辑的数据集,我们可以rbind原始数据集与我们根据&#39; val&#39;的比率创建的数据集。与其他列按“&lt; datum&#39;

”分组

在这里,我正在使用data.table。我们转换了&#39; data.frame&#39;到&#39; data.table&#39; (setDT(df1))。由“基准”组成的分组&#39; (by = .(Datum)),我们得到&#39; val&#39;对于相应的&#39; N&#39; P&#39; Par&#39;中的元素。由于缺少日期或日期只有一个值,我们将条件(if(.N>1))保留为该行,即。如果.Datum组中的行数大于1,我们进行比率计算并创建“N / P”。作为&#39; Par&#39;柱。完成此操作后,我们可以rbind使用原始数据集。

 library(data.table)
 setDT(df1) 
 rbind(df1,df1[, if(.N>1) list(Par='N/P', 
           val=val[Par=='N']/val[Par=='P'] ), .(Datum)])
#         Datum Par       val
# 1: 2015-01-01   N 10.000000
# 2: 2015-02-02   N  9.000000
# 3: 2015-03-03   N  8.000000
# 4: 2015-04-04   N  7.000000
# 5: 2015-05-05   N  6.000000
# 6: 2015-02-02   P  5.000000
# 7: 2015-04-04   P  4.000000
# 8: 2015-01-01   P  3.000000
# 9: 2015-03-03   P  2.000000
#10: 2015-05-05   P  1.000000
#11: 2015-01-01 N/P  3.333333
#12: 2015-02-02 N/P  1.800000
#13: 2015-03-03 N/P  4.000000
#14: 2015-04-04 N/P  1.750000
#15: 2015-05-05 N/P  6.000000