我正在使用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) 我知道周围有很多类似的问题,但我担心无法理解这个问题,尽管很明显它很简单!
我试图通过使用列名(而不是数字)编写一个简单的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) 我正在尝试在 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) 我正在阅读位于http://adv-r.had.co.nz/Functionals.html的Hadley的AdvancedR 。他谈到的区别sapply和vapply。我的问题与使用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 中运行并行进程还很陌生,因为我使用的大部分数据都不是那么大。但是,我没有使用更大的数据集,我试图从 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 循环之外工作。谢谢您的帮助。
我无法正确编码循环以将行添加到小数据集。
假设我有以下名为“颜色”的数据框:
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)
这个函数返回的是整个数据集,最后只有两个零值之一。我明白为什么这是一个错误,我相信解决方案很简单,但我不知道如何纠正它。有什么建议? …
我正在尝试使用 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 比较陌生,并且经常将相同的函数应用于多个变量(通常通过多次复制代码),因此了解如何正确使用这些函数会很棒:)
我有一个由+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)
但这需要太长时间.有什么建议如何提高性能?
在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) 我有一些数据,如下所示
"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中建议我一个替代方案