我有以下数据框
df <- data.frame(
Type=rep(LETTERS[1:6],3),
Level=rep(1:3,each=6),
Value=1:18)
我想添加2列
最终以
结束> df
Type Level Value r1 r2
1 A 1 1 1.000000 1.0
2 B 1 2 2.000000 1.0
3 C 1 3 3.000000 1.0
4 D 1 4 4.000000 1.0
5 E 1 5 5.000000 1.0
6 F 1 6 6.000000 1.0
7 A 2 7 1.000000 7.0
8 B 2 8 1.142857 4.0
9 C 2 9 1.285714 3.0
10 D 2 10 1.428571 2.5
11 E 2 11 1.571429 2.2
12 F 2 12 1.714286 2.0
13 A 3 13 1.000000 13.0
14 B 3 14 1.076923 7.0
15 C 3 15 1.153846 5.0
16 D 3 16 1.230769 4.0
17 E 3 17 1.307692 3.4
18 F 3 18 1.384615 3.0
我尝试了一些apply
类型的方法,但无法得到它。我最终得到了一个双for
循环:
for(i in unique(df$Type)) {
for(j in unique(df$Level)) {
df$r1[df$Level==j & df$Type==i] <- df$Value[df$Level==j & df$Type==i]/df$Value[df$Level==j & df$Type=="A"]
df$r2[df$Level==j & df$Type==i] <- df$Value[df$Level==j & df$Type==i]/df$Value[df$Level==1 & df$Type==i]
}
}
这不是太糟糕,但我想知道是否存在分裂 - 应用 - 组合方法可以做到这一点,也许是plyr
中的某些内容。
答案 0 :(得分:2)
由于您提出了plyr
解决方案:
df <- ddply(df, .(Level), transform, r1 = Value / Value[Type == "A"])
df <- ddply(df, .(Type), transform, r2 = Value / Value[Level == 1])
我认为很好。
答案 1 :(得分:1)
首先创建向量,然后将它们绑定到数据框:
r1 <- df$Value / df$Value[rep(df$Value[df$Type=='A'], each=length(levels(df$Type)))]
r2 <- df$Value / df$Value[seq_along(levels(df$Type))]
这假设每个“级别”都重复“类型”,如您的示例所示。
这是适当的cbind()调用:
cbind(df, r1, r2)