标签: sapply

sapply()返回令人惊讶的结果 - R.

我正在使用glm()根据我制作的向量(h1_lines)中的值创建一些不同的模型.我希望sapply为向量中的每个值返回一个模型.相反,我的代码当前返回列表列表,其中列表的一部分是模型.它似乎正在返回我在sapply函数中所做的一切.

train = data.frame(scores=train[,y_col], total=train[,4], history=train[,5], line=train[,6])
h1_lines<- c(65, 70, 75)

models <- sapply(h1_lines, function(x){
                 temp_set<-train
                 temp_set$scores<-ifelse(temp_set$scores>x,1,
                                     ifelse(temp_set$scores<x,0,rbinom(dim(temp_set)[1],1,.5)))

                 mod<-glm(scores ~ total + history + line, data=temp_set, family=binomial)
                                    })
Run Code Online (Sandbox Code Playgroud)

我希望代码能够工作,所以在这些行之后我可以做到:

predict(models[1,], test_case)
predict(models[2,], test_case)
predict(models[3,], test_case)
Run Code Online (Sandbox Code Playgroud)

但是现在我不能这样做导致sapply返回的不仅仅是模型...如果我打印(昏暗(模型))它说模型有30行和3列?

编辑添加问题;

使用下面的建议代码工作得很好,我可以做预测(模型[[1]],test_case),它完美地工作.如何返回/保存模型,以便我可以使用我用来创建模型的密钥访问它们?例如,使用h1_scores可能类似于以下内容:

predict(models[[65]], test_case))

predict(models[[key==65]], test_case)
Run Code Online (Sandbox Code Playgroud)

r function vector sapply

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

如何通过列名应用ifelse函数?

我知道周围有很多类似的问题,但我担心无法理解这个问题,尽管很明显它很简单!

我试图通过使用列名(而不是数字)编写一个简单的ifelse函数应用于数据框中的一系列列.我尝试做的是创建一个u_all如下所示的变量,而不重复键入列名.

dat <- data.frame(id=c(1:20),u1 = sample(c(0:1),20,replace=T) , u2 = sample(c(0:1),20,replace=T) , u3 = sample(c(0:1),20,replace=T)) 
dat<-within(dat,u_all<-ifelse (u1==1 | u2==1 |u3==1,1,0))
dat
Run Code Online (Sandbox Code Playgroud)

我尝试了很多变种,apply但显然我没有走上正确的轨道,因为这些分组功能分别复制了ifelse每列的功能.

dat2 <- data.frame(id=c(1:20),u1 = sample(c(0:1),20,replace=T) , u2 = sample(c(0:1),20,replace=T) , u3 = sample(c(0:1),20,replace=T)) 

dat2<-cbind(dat2,sapply(dat2[,grepl("^u\\d{1,}",colnames(dat2))],
                               function(x){ u_all<-ifelse(x==1 & !is.na(x),1,0)}))

dat2
Run Code Online (Sandbox Code Playgroud)

r function apply lapply sapply

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

如何使用 sapply 向数据框中添加行?

我正在尝试在 sapply 函数调用中向数据框添加行,但它返回一个矩阵,而我想要一个数据框,其中列中有变量,行中有名称/地址。

这是一个说明问题的简单示例。我这样做是为了避免使用“for”循环。有人可以教我应该怎么做吗?

# initialize and empty data frame
absdf <- data.frame(
    name = character(),
    address = character(), 
    city = character(),
    stringsAsFactors=FALSE)

# a numeric vector. 
idvs <- c(123, 465)

print("initial empty data frame:")
print(absdf)

absdf <- sapply(idvs, function(idv) {

    name <- paste("John Doe", idv)
    address <- "123 Main St."
    city <- "Elmhurst"

    absdf <- rbind(absdf, data.frame(
        name = name, 
        address = address,
        city = city,
        stringsAsFactors=FALSE))

})

# print it out - a sanity check
print("absdf final:")
print(absdf) …
Run Code Online (Sandbox Code Playgroud)

r sapply

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

使用vapply而不是sapply

我正在阅读位于http://adv-r.had.co.nz/Functionals.html的Hadley的AdvancedR 。他谈到的区别sapplyvapply。我的问题与使用vapply而不是有关sapply,他在示例中不会进一步讨论。

这是他的代码:

df2 <- data.frame(x = 1:10, y = Sys.time() + 1:10)
sapply(df2, class)
Run Code Online (Sandbox Code Playgroud)

这返回

$x
[1] "integer"

$y
[1] "POSIXct" "POSIXt"
Run Code Online (Sandbox Code Playgroud)

但是,当我运行时vapply,出现错误。

vapply(df2, class, character(1))
Run Code Online (Sandbox Code Playgroud)

错误:

Error in vapply(df2, class, character(1)) : values must be length 1,
 but FUN(X[[2]]) result is length 2
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

问题:1)当我用character(2)替换character(1)时,出现以下错误消息:

vapply(df2, class, character(2))
Error in vapply(df2, class, character(2)) : values must be length 2,
 but FUN(X[[1]]) result is length 1 …
Run Code Online (Sandbox Code Playgroud)

r sapply

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

如何并行化当前在 R 中的 for 循环中的 gsub?

我对尝试在 R 中运行并行进程还很陌生,因为我使用的大部分数据都不是那么大。但是,我没有使用更大的数据集,我试图从 9000 条调查评论中“查找和替换”一组大约 2000 个名称。我已经使用 gsub 创建了一个 for 循环来完成工作,但这需要很长时间:

completed <- 0

for (name in names){
  text_df$text <- sapply(text_df$text, gsub, pattern=paste0("(?<=\\W|^)", name, "(?=\\W|$)"), replacement="RemovedLeader", ignore.case=TRUE, perl=TRUE)
  completed <- completed + 1
  print(paste0("Completed ", completed," out of ", length(names)))
} 
Run Code Online (Sandbox Code Playgroud)

据我了解,这应该是一个相当简单的并行运行过程,但我遇到了一些麻烦。我已经尝试使用 parSapply 运行它,但是我很难重新编写 gsub(它本身目前在 for 循环中的一个 sapply 中)以在 for 循环之外工作。谢谢您的帮助。

parallel-processing for-loop r sapply

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

使用 rbind 在循环中添加 0 个值

我无法正确编码循环以将行添加到小数据集。

假设我有以下名为“颜色”的数据框:

color   count   group
Blue      3       1
Blue      2       2
Red       2       2
Green     1       1
Run Code Online (Sandbox Code Playgroud)

现在我需要为每列添加 0 个值,以便所有组都有每种颜色,也就是它应该看起来像:

color   count   group
Blue      3       1
Blue      2       2
Red       2       2
Green     1       1
Red       0       1 
Green     0       2
Run Code Online (Sandbox Code Playgroud)

我试图做的最接近我想要的解决方案的是:

color.u <- unique(colors$color)

color.z<- function(x){
  if(x %in% colors$color[colors$group == "1"] == F ) {
    rbind(colors, c(x, 0, "1"))
    }
if(x %in% colors$color[colors$group == "2"] == F ) {
    rbind(colors, c(x, 0, "2"))
    }
}

sapply(color.u, function(x) color.z(x))
Run Code Online (Sandbox Code Playgroud)

这个函数返回的是整个数据集,最后只有两个零值之一。我明白为什么这是一个错误,我相信解决方案很简单,但我不知道如何纠正它。有什么建议? …

grouping loops r sapply rbind

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

在 r 中的多列(变量)上使用函数

我正在尝试使用 car 包中的 leveneTest 函数运行方差同质性测试。我可以像这样对单个变量运行测试(以 iris 数据集为例)

library(car)
library(datasets)

data(iris)

leveneTest(iris$Sepal.Length, iris$Species)
Run Code Online (Sandbox Code Playgroud)

但是,我想同时对数据集中的所有因变量运行测试(所以 Sepal.Length、Sepal.Width、Petal.Length、Petal.Width)。我猜它与 apply 函数系列(sapply、lapply、tapply)有关,但我不知道怎么做。我最接近的是这样的:

lapply(iris, leveneTest(group = iris$Species))
Run Code Online (Sandbox Code Playgroud)

但是我得到了错误

Error in leveneTest.default(group = iris$Species) : 
  argument "y" is missing, with no default
Run Code Online (Sandbox Code Playgroud)

我的理解可能是因为它无法指定结果变量。我确信我一定遗漏了应用函数的一些明显用法,但我只是不明白它是什么。对基本问题表示歉意,但我对 R 比较陌生,并且经常将相同的函数应用于多个变量(通常通过多次复制代码),因此了解如何正确使用这些函数会很棒:)

r lapply sapply tapply

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

使用gsub和sapply的R性能问题

我有一个由+10万条记录组成的数据框(all_postcodes).[编辑]这里只是几条记录:

pcode  area  east    north   area2     area3      area4      area5
AB101AA 10  394251  806376  S92000003 S08000006  S12000033  S13002483
AB101AB 10  394232  806470  S92000003 S08000006  S12000033  S13002483
AB101AF 10  394181  806429  S92000003 S08000006  S12000033  S13002483
AB101AG 10  394251  806376  S92000003 S08000006  S12000033  S13002483
Run Code Online (Sandbox Code Playgroud)

我想使用以下函数创建一个包含其中一列的规范化版本的新列:

pcode_normalize <- function (x) {
x <- gsub("  ", " ", x)
if (length(which(strsplit(x, "")[[1]]==" ")) == 0) {
x <- paste(substr(x, 1, 4), substr(x, 5, 7))
}
x
}
Run Code Online (Sandbox Code Playgroud)

我试着按如下方式执行它:

all_postcodes$npcode <- sapply(all_postcodes$pcode, pcode_normalize)
Run Code Online (Sandbox Code Playgroud)

但这需要太长时间.有什么建议如何提高性能?

performance r gsub sapply

0
推荐指数
1
解决办法
529
查看次数

在因子上分割数据帧并应用函数

在R中,我想沿着因子变量分割数据帧,然后将函数应用于与该变量的每个级别有关的数据.我想在我的功能中完成所有这些.不知何故,数据没有被拆分?

我不理解将参数传递给嵌套在其他函数中的函数的所有细微差别.我最初尝试使用dplyr执行此操作,但无法将参数传递给嵌套在我的函数中的dplyr.

这是我的功能:

 myFun <- function(dat, strat.var, PSU, var1){
     strata <- as.character(unique(dat[, strat.var]))
     N.h <- length(strata)
     sdat <- with(dat, split(dat, strat.var))
     fun1 <- function(x){ length(unique(x[, PSU])) }
     fun2  <- function(x){ sum(tapply(x[, var1], x[, PSU],  mean)) }
     ns <- sapply(sdat, fun1)
     mns <- sapply(sdat, fun2)
     dfx <- data.frame(cbind(stratum=strata, ns=ns, mns=mns))
     return(list(N.h = N.h, out=dfx))
 }
Run Code Online (Sandbox Code Playgroud)

为了演示我使用的是warpbreaks数据,但是我的实际数据集有8个级别的"strat.var",并且嵌套在"PSU"的2到10级之间.

    myFun(dat=warpbreaks, strat.var="wool", PSU="tension", var1="breaks")
   # $N.h
   # [1] 2

   # $out
   #   stratum ns              mns
   # 1       A  3 84.4444444444444
   # 2       B  3 84.4444444444444 …
Run Code Online (Sandbox Code Playgroud)

r sapply dplyr

0
推荐指数
1
解决办法
1372
查看次数

如何在此列中展平值以分隔R中的列

我有一些数据,如下所示

"ID","PROD"
"1001658",6619
"100288",11843
"100288",20106
"1004303",921
Run Code Online (Sandbox Code Playgroud)

我需要将其转换为类似的格式

"ID","PROD_6619","PROD_11843","PROD_20106","PROD_921"
"1001658",1,0,0,0
"100288",0,1,1,0
"1004303",0,0,0,1
Run Code Online (Sandbox Code Playgroud)

基本上,原始数据集中PROD列中的每个值都在它自己的单独列中.请注意,上面的数据集只是一个示例,我不能硬编码为"PROD_6619","PROD_11843","PROD_20106","PROD_921".它可能会更多.

我尝试使用for循环迭代地编写这个,对于我庞大的数据集来说它非常慢.

你能在R中建议我一个替代方案

r flatten sapply

0
推荐指数
1
解决办法
66
查看次数