【发布时间】:2021-08-11 13:12:38
【问题描述】:
来自 Java 我正在尝试学习 R(和一些统计数据) 我正在尝试重现下表
来自 Jonathan Gillard:统计推断的第一门课程 此表显示了从存钱罐替换的两次平局的可能结果 存钱罐
使用以下代码,我遇到了一些意想不到的(至少对于 Java 程序员而言)行为。
前七行基本上给了我我想要的,除了 (5, 10) 和 (10, 5) 应该聚合在一个类别中。我曾想过为此使用一个集合,但集合库似乎把前 7 行弄乱了。
library(dplyr)
rm(list=ls())
piggybank <- c(5, 10, 10, 20, 50, 50)
draws <- expand.grid(d1=piggybank, d2=piggybank)
draws <- draws %>% rowwise() %>% mutate(sum=sum(c(d1,d2)), var=var(c(d1,d2)), mean=mean(c(d1,d2)))
draws <- draws %>% group_by(d1, d2, var, mean, sum) %>% summarise(n=n())
draws <- draws %>% ungroup() %>% mutate(P=n/sum(n))
nr <- nrow(draws)
aggdraws <- data.frame(x1x2=character(0), var=numeric(0), mean=numeric(0), sum=numeric(0), n=numeric(0))
str(aggdraws)
local(
for (i in 1:nr) {
newrow <<- data.frame(x1x2=character(1), var=numeric(1), mean=numeric(1), sum=numeric(1), n=numeric(10))
newrow$n <- draws[i, ]$n
newrow$var <- draws[i, ]$var
newrow$mean <- draws[i, ]$mean
newrow$sum <- draws[i, ]$mean
newrow$x1x2 <- paste(min(draws[i, ]$d1, draws[i, ]$d2), max(draws[i, ]$d1, draws[i, ]$d2))
#print(aggdraws)
if (nrow(aggdraws) > 0) {
for(j in 1:nrow(aggdraws)) {
print(paste(aggdraws[j,]$x1x2, newrow$x1x2))
if(aggdraws[j,]$x1x2 == newrow$x1x2) {
aggdraws[j,]$n <- aggdraws[j,]$n +newrow$n
} else {
aggdraws[nrow(aggdraws)+1, ] <- newrow
}
}
} else {
aggdraws[nrow(aggdraws)+1, ] <- newrow
}
}
)
newrow
newrow 似乎不是 for 循环的本地,它在每次迭代中都填充了一行。每次迭代都需要一个新实例
可能是因为这种行为 if(aggdraws[j,]$x1x2 == newrow$x1x2) 永远不会评估为 TRUE
任何帮助将不胜感激。对于来自 Java 或其他面向对象语言的程序员来说,是否有一本好书或其他资源指出了 R 的缺陷?
谢谢,
汉斯
【问题讨论】:
-
您好。我不太确定确切的问题。 R 的一个好的开始是本书R for Data Science,更高级的阅读n Advanced R。
-
newrow <<- data.frame(x1x2=character(1), var=numeric(1), mean=numeric(1), sum=numeric(1), n=numeric(10))-->n = numeric(10)创建一个长度为 10 的向量。将其替换为numeric(1)以获得长度为 1 的向量。可能这就是你奇怪行为的根源。
标签: r dataframe loops for-loop