Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 基于其他两个值对向量进行规格化_R_Plyr - Fatal编程技术网

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])