【发布时间】:2018-10-16 10:44:53
【问题描述】:
我在下面提到了数据框:
Month Val1 Val2 Part1 Part2
Feb-17 250 10000 25 100
A 25 2000 5 20
B 25 2000 5 20
C 100 2000 5 20
D 10 2000 5 20
E 40 2000 5 20
Jan-17 200 8000 50 100
A 20 1000 10 20
B 40 1600 10 20
C 100 1600 10 20
D 20 1600 10 20
E 20 2200 10 20
我想在Val1 和Per_2 在Val2 之后添加两列Per_1。将 2 月 17 日的数据与 1 月 17 日的数据进行比较,并给出增长百分比(增加或减少)。
注意:对于 A、B、C、D 和 E,2 月 17 日和 17 年 1 月的顺序会有所不同,这里 我想分别用 Jan-17 A 和 Jan-17 A 计算 Feb-17 A 的增长。
在 17 月的情况下,由于数据框中没有上个月的数据可比较,Per_1 和 Per_2 在这种情况下应该是 0.00%。
所需输出:
Month Val1 Per_1 Val2 Per_2 Part1 Part2
Feb-17 250 25.00% 10000 25.00% 25 100
A 25 25.00% 2000 100.00% 5 20
B 25 -37.50% 2000 25.00% 5 20
C 100 0.00% 2000 25.00% 5 20
D 10 -50.00% 2000 25.00% 5 20
E 40 100.00% 2000 -9.09% 5 20
Jan-17 200 0.00% 8000 0.00% 50 100
C 100 0.00% 1600 0.00% 10 20
A 20 0.00% 1000 0.00% 10 20
B 40 0.00% 1600 0.00% 10 20
E 20 0.00% 2200 0.00% 10 20
D 20 0.00% 1600 0.00% 10 20
【问题讨论】:
-
首先,你应该改变你的data.frame的格式来做这个操作。原因很简单:行代表不同的个体,因为第 1 行是指聚合样本,而第 2 到 6 行是指个体样本。一旦你有一个一致的data.frame(意味着所有的行代表相同性质的个体),你可以简单地根据变量月份执行分组并使用公式计算相对变化来计算连续行之间的差异,如
lag、@987654331 @ 或diff -
@Seymour 我们不能在多个 if else 条件下执行这些操作吗??
-
您可能可以,但这种方法会使您的生活复杂化。但是,你能提供一个可重现的例子吗?
-
@Seymour 这是可重现的示例:
structure(list(Month = c("Feb-17", "A", "B", "C", "D", "E", "Jan-17", "A", "B", "C", "D", "E"), Val1 = c(250L, 25L, 25L, 100L, 10L, 40L, 200L, 20L, 40L, 100L, 20L, 20L), Val2 = c(10000L, 2000L, 2000L, 2000L, 2000L, 2000L, 8000L, 1000L, 1600L, 1600L, 1600L, 2200L), Part1 = c(25L, 5L, 5L, 5L, 5L, 5L, 50L, 10L, 10L, 10L, 10L, 10L), Part2 = c(100L, 20L, 20L, 20L, 20L, 20L, 100L, 20L, 20L, 20L, 20L, 20L)), class = "data.frame", row.names = c(NA, -12L)) -
我还在努力理解你的专栏
month...