ddply 函数忽略的迭代器
Iterator ignored by ddply function
在 data.frame 中,我试图确定由另一列汇总的某些列的各种分位数。例如,假设我想要每个 iris$Species
.
的 iris$Petal.Length
的各种分位数
分位数的数量和值是动态的,所以最终我会尝试遍历概率或以某种方式对其进行矢量化。这是我的矢量化尝试,但不太奏效。
rm(list = ls())
require(plyr)
myDat <- iris
myProbs <- c(0, 0.15, 0.5, 1)
# This doesn't return the DF I'm looking for (where probabilities/names are identified)
petals_by_species <- ddply(myDat, "Species", summarize, Quantiles = quantile(Petal.Length, probs = myProbs))
petals_by_species
以上 return 是正确的数据,但不是优雅的格式。输出显示如下:
上面的值是正确的,但是如何转换为宽格式并不直观,也没有明确说明概率是多少。
我尝试了一些 hacky 解决方法,将结果合并为一些宽格式,如下所示:
rm(list = ls())
require(plyr)
myDat <- iris
myProbs <- c(0, 0.15, 0.5, 1)
# So, I loop through the probabilities and combine.
for(i in 1:length(myProbs)){
temp <- ddply(myDat, "Species", summarize, Quantiles = quantile(Petal.Length, probs = myProbs[i]))
names(temp) <- c("Species", paste0("Prob ", myProbs[i]))
if(i == 1){
petals_by_species <- temp
} else {
petals_by_species <- merge(petals_by_species, temp)
}
}
petals_by_species
此输出完全令人困惑...列名正确,但值不正确(每列重复出现)。
None 以上列 return 正确值。
很明显,我的处理方式不正确。但是现在我的好奇心被激起了,为什么下面的代码行 return 有不同的值?
require(plyr)
myDat <- iris
myProbs <- c(0, 0.15, 0.5, 1)
intendedOutput <- ddply(myDat, "Species", summarize, Quantiles = quantile(Petal.Length, probs = myProbs[1]))
intendedOutput
i = 1
unintendedOutput <- ddply(myDat, "Species", summarize, Quantiles = quantile(Petal.Length, probs = myProbs[i]))
unintendedOutput
如何让 ddply
以我期望的方式识别我的迭代器?我应该使用其他 plyr
函数吗?我已经尝试 daply
但没有成功。
谢谢。
这是票,来自与哈德利的单独通信:
rm(list = ls())
require(plyr)
myDat <- iris
myProbs <- c(0, 0.15, 0.5, 1)
# This doesn't return the DF I'm looking for (where probabilities/names are identified)
petals_by_species <- ddply(myDat, "Species", summarize, Quantiles = quantile(Petal.Length, probs = myProbs), probs = myProbs)
petals_by_species
然后我的输出是长格式的,报告了输入,就像这样:
在 data.frame 中,我试图确定由另一列汇总的某些列的各种分位数。例如,假设我想要每个 iris$Species
.
iris$Petal.Length
的各种分位数
分位数的数量和值是动态的,所以最终我会尝试遍历概率或以某种方式对其进行矢量化。这是我的矢量化尝试,但不太奏效。
rm(list = ls())
require(plyr)
myDat <- iris
myProbs <- c(0, 0.15, 0.5, 1)
# This doesn't return the DF I'm looking for (where probabilities/names are identified)
petals_by_species <- ddply(myDat, "Species", summarize, Quantiles = quantile(Petal.Length, probs = myProbs))
petals_by_species
以上 return 是正确的数据,但不是优雅的格式。输出显示如下:
上面的值是正确的,但是如何转换为宽格式并不直观,也没有明确说明概率是多少。
我尝试了一些 hacky 解决方法,将结果合并为一些宽格式,如下所示:
rm(list = ls())
require(plyr)
myDat <- iris
myProbs <- c(0, 0.15, 0.5, 1)
# So, I loop through the probabilities and combine.
for(i in 1:length(myProbs)){
temp <- ddply(myDat, "Species", summarize, Quantiles = quantile(Petal.Length, probs = myProbs[i]))
names(temp) <- c("Species", paste0("Prob ", myProbs[i]))
if(i == 1){
petals_by_species <- temp
} else {
petals_by_species <- merge(petals_by_species, temp)
}
}
petals_by_species
此输出完全令人困惑...列名正确,但值不正确(每列重复出现)。
None 以上列 return 正确值。
很明显,我的处理方式不正确。但是现在我的好奇心被激起了,为什么下面的代码行 return 有不同的值?
require(plyr)
myDat <- iris
myProbs <- c(0, 0.15, 0.5, 1)
intendedOutput <- ddply(myDat, "Species", summarize, Quantiles = quantile(Petal.Length, probs = myProbs[1]))
intendedOutput
i = 1
unintendedOutput <- ddply(myDat, "Species", summarize, Quantiles = quantile(Petal.Length, probs = myProbs[i]))
unintendedOutput
如何让 ddply
以我期望的方式识别我的迭代器?我应该使用其他 plyr
函数吗?我已经尝试 daply
但没有成功。
谢谢。
这是票,来自与哈德利的单独通信:
rm(list = ls())
require(plyr)
myDat <- iris
myProbs <- c(0, 0.15, 0.5, 1)
# This doesn't return the DF I'm looking for (where probabilities/names are identified)
petals_by_species <- ddply(myDat, "Species", summarize, Quantiles = quantile(Petal.Length, probs = myProbs), probs = myProbs)
petals_by_species
然后我的输出是长格式的,报告了输入,就像这样: