基于长格式日期的行划分
Division of rows based on date in long format
我有一个数据框:
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 = N 的行除以 par = P 的行,并将其添加到数据框。预期结果应该是:
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
从 reshape2
),然后对列求和,并将它们粘贴到原始 df1 下,但这似乎有点复杂。
所以我的问题是,这可以用长格式完成吗?
使用编辑后的数据集,我们可以 rbind
原始数据集与我们根据 'val' 的比率创建的数据集与按 'Datum' 分组的其他列。
这里,我使用的是data.table
。我们将 'data.frame' 转换为 'data.table' (setDT(df1)
)。按'Datum'(by = .(Datum)
)分组,得到'Par'中对应'N'、'P'元素的'val'的比例。由于缺少日期或只有一个值的日期,我们按条件 (if(.N>1)
) 即保留该行。如果该 .Datum 组中的行数大于 1,我们将进行比率计算并创建 'N/P' 作为 'Par' 列。完成后,我们可以 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
我有一个数据框:
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 = N 的行除以 par = P 的行,并将其添加到数据框。预期结果应该是:
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
从 reshape2
),然后对列求和,并将它们粘贴到原始 df1 下,但这似乎有点复杂。
所以我的问题是,这可以用长格式完成吗?
使用编辑后的数据集,我们可以 rbind
原始数据集与我们根据 'val' 的比率创建的数据集与按 'Datum' 分组的其他列。
这里,我使用的是data.table
。我们将 'data.frame' 转换为 'data.table' (setDT(df1)
)。按'Datum'(by = .(Datum)
)分组,得到'Par'中对应'N'、'P'元素的'val'的比例。由于缺少日期或只有一个值的日期,我们按条件 (if(.N>1)
) 即保留该行。如果该 .Datum 组中的行数大于 1,我们将进行比率计算并创建 'N/P' 作为 'Par' 列。完成后,我们可以 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