在R中的数据框中存储double

时间:2016-02-27 05:05:09

标签: r dataframe double

我的数据框如下:

* 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类型的对象吗?我做错了什么?

1 个答案:

答案 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