我的数据框如下:
* Run code only for the states and FYs I list in StatesToRun.dta.
use "C:/temp/StatesToRun.dta", clear
levelsof state, local(statelist)
levelsof FY, local(FYlist)
foreach MyState of local statelist {
foreach MyFY of local FYlist {
use "C:/temp/SalesFigures 'MyFY'.dta", clear
keep if state == `"`MyState'"'
* etc. ...
}
}
通过以下迭代过程
fitnorm <- data.frame(dataset=0,mean=0,sd=0,normopl=0)
但是,我收到了这个错误。
normdat <- rnorm(25, mean = 30, sd = sqrt(9))
fitnorm[i,1] <- normdat
fitnorm[i,2] <- mean(normdat)
fitnorm[i,3] <- sd(normdat)
fitnorm[i,4] <- qnorm(1-(400/1000), mean=fitnorm[i,2], sd=fitnorm[i,3])
我知道这是因为我试图将'normdat'(double类型和25号)放入数据帧的单个元素中。数据帧不应该能够容纳double类型的对象吗?我做错了什么?
答案 0 :(得分:2)
数据框是否应该能够容纳double类型的对象?我做错了什么?
它可以。但这不是你正在做的事情
在第
行-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
KKContactTpye *contactType = self.contactTypes[indexPath.row];
[[NSNotificationCenter defaultCenter] postNotificationName:@"ContactType" object:nil userInfo:@{@"ContactTypeName":contactType.Name,@"ContactTypeId":contactType.ID}];
[self dismissViewControllerAnimated:YES completion:nil];
}
您正尝试将数字向量(## I've assumed i <- 1
fitnorm[i,1] <- normdat
)分配给数据框的一个单元格(即行normdat
,第1列)
您是否正在尝试
i
<强>更新强>
根据您的评论,您无法将数据存储在data.frame的单个项目中,您需要使用列表:
fitnorm[i,1] <- normdat[i]
如果您 想要使用lst <- list(dataset = normdat,
mean = mean(normdat),
sd = sd(normdat),
normopl = qnorm(1-(400/1000), mean=fitnorm[i,2], sd=fitnorm[i,3]))
## Which gives
lst
$dataset
[1] 33.43470 28.66693 29.41060 32.95761 32.66531 29.86056 31.61961 29.32424 28.07063 31.80155
[11] 32.88489 31.90562 31.81625 24.62625 31.19141 27.41913 31.43993 29.60108 29.73310 23.77482
[21] 28.50347 27.22960 24.65698 27.13001 35.85981
$mean
[1] 29.82336
$sd
[1] 2.981638
$normopl
[1] 30.57875
,则必须使每列的长度相同
data.frame
按OP编辑
以上代码有效。但是,由于列表必须是迭代的,我做了一些改动。
fitnorm <- data.frame(dataset = normdat,
mean = mean(normdat),
sd = sd(normdat),
normopl = qnorm(1-(400/1000), mean=fitnorm[i,2], sd=fitnorm[i,3]))
head(fitnorm)
# dataset mean sd normopl
#1 33.43470 29.82336 2.981638 30.57875
#2 28.66693 29.82336 2.981638 30.57875
#3 29.41060 29.82336 2.981638 30.57875
#4 32.95761 29.82336 2.981638 30.57875
#5 32.66531 29.82336 2.981638 30.57875
#6 29.86056 29.82336 2.981638 30.57875
更新 - Symbolix
有一个经验法则&#39;在fitnorm <- list(dataset=list(),mean=list(),sd=list(),normopl=list())
for (i in 1:5000){
normdat <- rnorm(25, mean = 30, sd = sqrt(9))
fitnorm$dataset[[i]] <- normdat
fitnorm$mean[[i]]<- mean(normdat)
fitnorm$sd[[i]] <- sd(normdat)
fitnorm$normopl[[i]] <- qnorm(1-(400/1000), mean=fitnorm$mean[[i]], sd=fitnorm$sd[[i]])
}
fitnorm$dataset[1]
[[1]]
[1] 33.43470 28.66693 29.41060 32.95761 32.66531 29.86056 31.61961 29.32424 28.07063 31.80155
[11] 32.88489 31.90562 31.81625 24.62625 31.19141 27.41913 31.43993 29.60108 29.73310 23.77482
[21] 28.50347 27.22960 24.65698 27.13001 35.85981
fitnorm$mean[1]
[[1]]
[1] 29.82336
fitnorm$sd[1]
[[1]]
[1] 2.981638
fitnorm$normopl[1]
[[1]]
[1] 30.57875
中,我试图坚持使用R
代替lapply
,因为通常更有效(它适用于{{1} }) - 已经在SO上讨论过这个问题。
因此,我会用
替换你的for
循环
C
快速进行基准测试:
for
最终,这个例子中的收益是微不足道的,但值得记住。
更新 - Symbolix 2
如果您愿意使用它们,也可以创建一个lst <- lapply(1:5000, function(x){
normdat <- rnorm(25, mean = 30, sd = sqrt(9))
list(fitnorm = list(dataset = normdat,
mean = mean(normdat),
sd = sd(normdat),
normopl = qnorm(1-(400/1000), mean = mean(normdat), sd = sd(normdat))
))
})
:
我在这里使用Unit: milliseconds
expr min lq mean median uq max neval
fun_lapply() 220.2830 236.1661 252.7315 249.1904 267.1123 337.0799 100
fun_for_loop() 373.5972 399.8972 427.1629 421.7407 442.4626 593.7227 100
套餐提供的速度
data.frame