Purrr实现前循环

时间:2019-10-11 03:21:33

标签: r for-loop tidyverse purrr

我正在尝试在R中开发一个逻辑回归模型。我正在试图遍历数据框(或小标题)的行,以便可以将该行中的列子集乘以另一个矢量作为点积

最初,我尝试使用purrr的向量函数来完成一些准备工作,但是遇到了困难,因此决定在for循环中实现它。

这是我使用前循环的工作设计:

library(tidyverse)

# Define necessary functions
 lambdaFunc <- function(factors,theta){
 return((1+exp(sum(factors*theta)))^(-1))
}

# y is 0 or 1
# x and theta are a numeric vectors
indiv_likhd <- function(y,x,theta){
 return(lambdaFunc(x,theta)^y*(1-lambdaFunc(x,theta))^(1-y))
}

# Assuming df is dataframe of the form
# Col1                Col2      ...     ColN
# isDefault(0 or 1)   factor1   ...     factorN
likhds <- function(df,theta){
 df <- as.data.frame(df)
 likhds <- vector("numeric",nrow(df))
 for (i in 1:nrow(df)) {
   likhds[i] <- indiv_likhd(df[i,1],df[i,2:ncol(df)],theta)
 }
 return(likhds)
}

所以

testdf <- tibble(y=c(1,0),x_1=c(1,1),x_2=c(1,1),x_3=c(1,1))
testTheta <- c(1,1,1)
likhds(testdf,testTheta)

收益

[1] 0.04742587 0.95257413

有没有一种方法可以使用矢量函数来实现,特别是purr包?这是我关于stackoverflow的第一个真实问题,因此,如果有遗漏或不清楚的地方,我深表歉意。在这种情况下,请告诉我。

谢谢。

2 个答案:

答案 0 :(得分:0)

这是一个选择

f <- function(df, theta) {
    df %>%
        group_by(y) %>%
        nest() %>%
        mutate(likhds = map2_dbl(y, data, function(y, x) indiv_likhd(y, x, theta))) %>%
        pull(likhds)
}
f(testdf, testTheta)
#[1] 0.04742587 0.95257413

说明:我们用nesty个数据,然后使用map2_dbl遍历ydata对(即您的{{1 }}值),并以x向量的形式返回indiv_likhd的输出。

答案 1 :(得分:0)

无需更改您的git >=2.23lambdaFunc,我们可以使用indiv_likhd重写您的for循环

pmap

library(dplyr) library(purrr) testdf %>% mutate(new_col = pmap_dbl(., ~indiv_likhd(c(...)[1], c(...)[-1], testTheta))) # y x_1 x_2 x_3 new_col # <dbl> <dbl> <dbl> <dbl> <dbl> #1 1 1 1 1 0.0474 #2 0 1 1 1 0.953 用于捕获传递到c(...)的所有值(此处是整行),因此pmap表示该行中的第一个值,c(...)[1]表示所有内容除了该行中的第一个值。