相关疑难解决方法(0)

用R来思考向量

我知道R可以最有效地使用向量,并且应该避免循环.我很难教自己用这种方式编写代码.我想了解如何"矢量化"我的代码.下面是为10,000个非唯一的state(st),plan1(p1)和plan2(p2)组合创建10年样本数据的示例:

st<-NULL
p1<-NULL
p2<-NULL
year<-NULL
i<-0
starttime <- Sys.time()

while (i<10000) {
    for (years in seq(1991,2000)) {
        st<-c(st,sample(c(12,17,24),1,prob=c(20,30,50)))
        p1<-c(p1,sample(c(12,17,24),1,prob=c(20,30,50)))
        p2<-c(p2,sample(c(12,17,24),1,prob=c(20,30,50)))    
        year <-c(year,years)
    }
        i<-i+1
}
Sys.time() - starttime
Run Code Online (Sandbox Code Playgroud)

这需要大约8分钟才能在我的笔记本电脑上运行.我最终得到了4个向量,每个向量都有100,000个值,正如预期的那样.如何使用矢量函数更快地完成此操作?

作为旁注,如果我将上面的代码限制为1000循环,它只需要2秒,但10,000需要8分钟.知道为什么吗?

r vector

25
推荐指数
2
解决办法
2680
查看次数

矢量化我的想法:R中的矢量运算

所以早些时候我回答了自己关于在R中向量中思考的问题.但是现在我还有另一个问题,我无法"矢量化".我知道向量更快,循环更慢,但我无法弄清楚如何在向量方法中执行此操作:

我有一个数据框(出于感情上的原因,我喜欢称之为my.data),我想对其进行全面的边缘分析.我需要一次删除一些元素并"数值"数据框然后我需要通过仅删除下一个元素再次进行迭代.然后再做一次......再次......我的想法是对我的数据子集进行全面的边际分析.无论如何,我无法想象如何以矢量有效的方式做到这一点.

我缩短了代码的循环部分,它看起来像这样:

for (j in my.data$item[my.data$fixed==0]) { # <-- selects the items I want to loop 
                                            #     through
    my.data.it <- my.data[my.data$item!= j,] # <-- this kicks item j out of the list
    sum.data <-aggregate(my.data.it, by=list(year), FUN=sum, na.rm=TRUE) #<-- do an
                                                                         # aggregation

    do(a.little.dance) && make(a.little.love) -> get.down(tonight) # <-- a little
                                                                   #  song and dance

    delta <- (get.love)                                         # <-- get some love
    delta.list<-append(delta.list, delta, after=length(delta.list)) #<-- put my love
                                                                    #    in a vector 
}
Run Code Online (Sandbox Code Playgroud)

显然我在中间砍掉了一堆东西,只是为了让它不那么笨拙.目标是使用更高矢量效率的东西来移除j循环.有任何想法吗?

r vector

14
推荐指数
2
解决办法
6590
查看次数

将pnorm应用于数据框的列

我正在尝试规范化数据框中的一些数据.我想获取每个值并通过pnorm函数运行它以及值所在列的平均值和标准偏差.使用循环,这是我将如何写出我想要做的事情:

#example data
hist_data <- data.frame( matrix( rnorm( 200,mean=5,sd=.5 ),nrow=20 ) )

n <- dim( hist_data )[2] #columns=10
k <- dim( hist_data )[1] #rows   =20

#set up the data frame which we will populate with a loop
normalized <- data.frame( matrix( nrow = nrow( hist_data ), ncol = ncol( hist_data ) ) )

#hot loop in loop action
for ( i in 1:n ){
   for ( j in 1:k ){
      normalized[j,i] <- pnorm( hist_data[j,i], 
                                mean = mean( hist_data[,i] ), 
                                sd …
Run Code Online (Sandbox Code Playgroud)

loops r apply

9
推荐指数
1
解决办法
5021
查看次数

从列表中选择最终项目

我有一个名单,想提取每个人的姓氏.复杂的是,有些条目有中间名,有些有昵称等.这是我的例子,基于这个问题,但改变格式以反映我的情况:

df <- c("bob smith","mary ann d. jane","jose chung","michael mike marx","charlie m. ivan")
Run Code Online (Sandbox Code Playgroud)

要获得名字,我使用以下内容:

firstnames <- sapply(strsplit(df, " "), '[',1)
Run Code Online (Sandbox Code Playgroud)

然而,有没有办法让元素处于"最终"位置?提前致谢.

r

3
推荐指数
1
解决办法
124
查看次数

标签 统计

r ×4

vector ×2

apply ×1

loops ×1