我不使用那么多函数,但当我使用时,我倾向于使用匿名函数和某种形式的apply. 然而,我现在正在尝试编写一个可以处理列表中的项目的函数。
有两个列表,每个列表都有许多项目(我所说的项目是指例如mylist1[1])。所有项目都是数据框。我想从中获取第一个数据帧mylist1和第一个数据帧,mylist2并在这些数据帧中的列上运行一堆函数。然后取出第二mylist1项和第二mylist2项,依此类推......
下面是我习惯写的东西,但在这种情况下显然不适用于两个列表。任何人都可以帮我找到一种快速的方法来弄清楚我应该如何使用似乎sapply导致主要问题的方法以外的方法来解决这个问题。
a <- c(1:10)
b <- c(1:10)
z <- c(rep("x", 5), rep("y", 5))
df <- data.frame(cbind(a, b, z))
mylist1 <- split(df, z)
mylist2 <- split(df, z)
myfunction <- function(x, y)
{
a <- as.data.frame(x[1])
b <- as.data.frame(y[1])
meana <- mean(a[1])
meanb <- mean(b[1])
model <- lm(a[1]~b[1])
return(c(model$coefficients[2], meana, meanb))
}
result <- sapply(mylist1, mylist2, myfunction)
Run Code Online (Sandbox Code Playgroud)
subset我还只是想人们是否认为这样做会z比split这样做更好?
我试图在数据框中设置一个等于"US"或"Foreign"的列,具体取决于国家/地区.我认为这样做的正确方法是编写一个函数,然后用它sapply来实际更新数据帧.这是我第一次尝试过在这样的事情R-在SQL,我刚才写的UPDATE查询.
这是我的数据帧:
str(clients)
'data.frame': 252774 obs. of 4 variables:
$ ClientID : Factor w/ 252774 levels "58187855","59210128",..: 19 20 21 22 23 24 25 26 27 28 ...
$ Country : Factor w/ 207 levels "Afghanistan",..: 196 60 139 196 196 40 40 196 196 196 ...
$ CountryType : chr "" "" "" "" ...
$ OrderSize : num 12.95 21.99 5.00 7.50 44.5 ...
head(clients)
ClientID Country CountryType OrderSize
1 …Run Code Online (Sandbox Code Playgroud) 我有以下过于简单的示例来演示我的问题。如何将列名称分配给通过 生成的单列矩阵sapply?我知道这适用于for循环,所以想知道我是否在这里遗漏了一些东西。感谢任何建议。
> names <- c("apple", "bear", "cat", "dog")
> x <- sapply(1:4, FUN=function(y){
mat <- matrix(rnorm(10, mean=0, sd=2))
colnames(mat) <- names[y]
print(colnames(mat))
return(mat)
})
> x
[,1] [,2] [,3] [,4]
[1,] 0.50453 -0.15463 2.3660 -0.1451
[2,] -0.18460 2.01499 -1.4656 0.5702
[3,] 0.41206 -0.94563 -0.5911 0.6568
[4,] -0.01510 1.88728 2.2698 0.2722
[5,] -0.67850 -0.48196 0.7322 -0.1656
[6,] 3.88306 0.25590 -0.9625 -0.5595
[7,] 0.09948 -0.48730 2.5696 -1.7280
[8,] 0.38895 -0.07124 -2.0728 2.4206
[9,] -1.23075 2.09420 1.3673 0.1967 …Run Code Online (Sandbox Code Playgroud) 我有一个简单的问题.假设我有一个长度为500的Obj列表
Obj[[1]], Obj[[2]], ....Obj[[500]], #for each Obj[[i]], it has an element
Obj[[i]]$logL,
Run Code Online (Sandbox Code Playgroud)
我的问题是如何提取每个Obj的logL以避免像这样的for循环?
logL = rep(NA, length(Obj))
for(i in 1: length(Obj)){
logL[i] = Obj[[i]]$logL
}
Run Code Online (Sandbox Code Playgroud)
有没有办法用sapply或像plyr这样的高级软件包来做到这一点?我对解决方案持开放态度,因为它比for循环更快,因为我需要在MCMC中执行此操作,并且列表的长度可以是3000,因此我更喜欢一些快速方法.
提前致谢!
这是我正在使用的代码:
A <- matrix(1:9, nrow = 3)
A
cbind(A,A,A)
Run Code Online (Sandbox Code Playgroud)
这给出了一个输出:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] 1 4 7 1 4 7 1 4 7
[2,] 2 5 8 2 5 8 2 5 8
[3,] 3 6 9 3 6 9 3 6 9
Run Code Online (Sandbox Code Playgroud)
所需的输出是......
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] 1 1 1 4 4 4 7 7 7
[2,] 2 2 2 5 5 5 8 8 8
[3,] …Run Code Online (Sandbox Code Playgroud) 我用这个sapply函数:
set.seed(1)
data<-matrix(runif(1000000,0,1),1000000,2)
sapply(seq(0.0025, 0.9975, by=0.005), function (x) qbeta(x, data$a, data$b))
Run Code Online (Sandbox Code Playgroud)
由于数据可以有1 mn行,因此可能需要很长时间.a和b是唯一的随机值.
如何提高性能?是从每一行中查找参数需要花费时间,还是只是不可避免?我已经尝试了并行版本,它减少了时间,但它仍然很慢.
一些结果(我在38k行上做了这个):
> system.time(matrix(qbeta(rep(seq(0.0025, 0.9975, by=0.005),each=nrow(data)),data$a, data$b),nrow=nrow(data)))
user system elapsed
34.53 0.00 34.53
> system.time(sapply(seq(0.0025, 0.9975, by=0.005), function (x) qbeta(x, data$a, data$b)))
user system elapsed
34.22 0.00 34.21
Run Code Online (Sandbox Code Playgroud)
这是我的并行代码:
steps<-seq(0.0025, 0.9975, by=0.005)
qbeta.func <- function(x, data) {
return(qbeta(x, data$a, data$b) * data$value)
}
cl <- makeCluster(rep("localhost",4), type = "SOCK")
t1 <- Sys.time()
data <- parSapply(cl, steps, qbeta.func, data)#
stopCluster(cl)
#data <- data[1:20,1:20]
Run Code Online (Sandbox Code Playgroud) The following code block taken from chernan's sample REST queries will apply FUN to a list of parameters, but "param_name" is not provided. How is this possible?
rcurl_request <- function(service_url, parameters) {
# Collapse all parameters into one string
all_parameters <- paste(
sapply(names(parameters),
FUN=function(param_name, parameters) {
paste(param_name, paste(parameters[[param_name]], collapse=','), collapse='', sep='=')
},
parameters),
collapse="&")
# Paste base URL and parameters
requested_url <- paste0(service_url, all_parameters)
# Encode URL (in case there would be any space character for instance)
requested_url <- URLencode(requested_url) …Run Code Online (Sandbox Code Playgroud) 我有一个矩阵m(由三列组成,每列由整数组成,平均值分别为5,10和15):
m <- round(matrix(data=cbind(rnorm(30, 5), rnorm(30, 10), rnorm(30, 15)), nrow=30, ncol=3), 0)
现在,我希望有一个与m相同尺寸的矩阵,其中每个值x计算为x减去找到x的列的平均值.如何才能做到这一点?我尝试过应用各种应用函数(具体来说,我一直在查看user3640617和User60的两个问题),但问题似乎是我不能使用行的平均值作为参数sapply,lapply或者vapply......
示例:如果head(m)是
[,1] [,2] [,3]
[1,] 6 11 14
[2,] 6 8 16
[3,] 6 11 15
[4,] 6 10 17
[5,] 5 9 15
[6,] 3 10 15
Run Code Online (Sandbox Code Playgroud)
我想得到
[,1] [,2] [,3]
[1,] 1 1 -1
[2,] 1 -2 1
[3,] 1 1 0
[4,] 1 0 2
[5,] 0 -1 0
[6,] -2 0 …Run Code Online (Sandbox Code Playgroud) 这是我第一次在这里发帖。当我遇到错误(或错误)时,我通常会寻找替代方案,但是,由于我将在 R 中走得更远更深入,所以我很高兴了解正在发生的事情。
我做了一个简单的例子来重现错误:
因此,似乎“手动”, sapply(a,replicate,b) 确实有效。但是,函数内的该表达式会返回错误。我在网上搜索了大约 1 小时,但没有找到类似的东西。
我感谢你的时间,
我有一个变量:
x$value
[[1]]
NULL
Run Code Online (Sandbox Code Playgroud)
但是当我跑步时,is.null(x$value)我得到:
is.null(x$value)
[1] FALSE
Run Code Online (Sandbox Code Playgroud)
这怎么可能?我怎样才能解决这个问题?我在sum(sapply((data$iteration), FUN = function(x) {ifelse(is.null(x$value), 0, x$value)}), na.rm = TRUE)一个错误中使用它:
Error in sum(sapply((data$iteration), FUN = function(x) { :
invalid 'type' (list) of argument
Run Code Online (Sandbox Code Playgroud) 我有一个列表,其中每个元素都是一组数字.所有组的长度都不同:
a <- list(1,c(2,3),c(4,5,6))
#> a
#[[1]]
#[1] 1
#[[2]]
#[1] 2 3
#[[3]]
#[1] 4 5 6
Run Code Online (Sandbox Code Playgroud)
我想得到每组中一个元素的所有可能组合.在这个例子中它应该是:
1 2 4,1 2 5,1 2 6,1 3 4,1 3 5,1 3 6
我觉得*apply-functions的某些组合在这里很有用,但是无法弄清楚如何做到这一点.