R 基于其他两个值对向量进行规格化
我有以下数据帧R 基于其他两个值对向量进行规格化,r,plyr,R,Plyr,我有以下数据帧 df <- data.frame( Type=rep(LETTERS[1:6],3), Level=rep(1:3,each=6), Value=1:18) 我尝试了一些applytype方法,但没有成功。我最终得到了一个双for循环: for(i in unique(df$Type)) { for(j in unique(df$Level)) { df$r1[df$Level==j & df$Type==i] <- df$Value
df <- data.frame(
Type=rep(LETTERS[1:6],3),
Level=rep(1:3,each=6),
Value=1:18)
我尝试了一些apply
type方法,但没有成功。我最终得到了一个双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]
}
}
for(i为唯一(df$Type)){
对于(j唯一(df$Level)){
df$r1[df$Level==j&df$Type==i]首先创建向量,然后将它们cbind到数据帧:
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))]
由于您建议了plyr
解决方案:
df <- ddply(df, .(Level), transform, r1 = Value / Value[Type == "A"])
df <- ddply(df, .(Type), transform, r2 = Value / Value[Level == 1])
df除非ddply正在做一些我不理解的事情(这是很可能的),否则它看起来像是在做向量操作df$Value/df$Value[df$Type==“A”]。这会以错误的顺序回收三个“A”值的元素。因此调用rep()在我的回答中。不,它做的是正确的事情。ddply
的第二个参数是用于分组数据的变量,因此有一个单独的Type==“a”
对于每个级别,而不是你建议的三个级别。你可以运行我的解决方案来检查它是否正确并与你的结果相匹配。它也更一般,因为它不依赖于假设组必须具有相同的长度。确实。我需要研究plyr。有趣的是,它重新排序了数据行frame.是的,这正是我要找的东西。我没有想过使用transform
函数。谢谢。@MatthewLundberg还有一点很有趣,那就是如果这两条语句以相反的顺序运行,数据帧将保持原来的顺序。我想每条语句中的重新组合与它的运行方式是一致的我们分手了。
cbind(df, r1, r2)
df <- ddply(df, .(Level), transform, r1 = Value / Value[Type == "A"])
df <- ddply(df, .(Type), transform, r2 = Value / Value[Level == 1])