每当我想在R中做一些"map"py时,我通常会尝试使用一个函数 apply家族中.
但是,我从来没有完全理解它们之间的区别 - 如何{ sapply,lapply等}将函数应用于输入/分组输入,输出将是什么样的,甚至输入可以是什么 - 所以我经常只要仔细检查它们,直到我得到我想要的东西.
有人可以解释如何使用哪一个?
我当前(可能不正确/不完整)的理解是......
sapply(vec, f):输入是一个向量.output是一个向量/矩阵,其中element i是f(vec[i])一个矩阵,如果f有一个多元素输出
lapply(vec, f):相同sapply,但输出是一个列表?
apply(matrix, 1/2, f):输入是一个矩阵.output是一个向量,其中element i是f(矩阵的row/col i)tapply(vector, grouping, f):output是一个矩阵/数组,其中矩阵/数组中的元素是向量f分组g的值,和g被推送到行/列名称by(dataframe, grouping, f):让我们g成为一个分组.适用f于组/数据框的每一列.漂亮打印分组和f每列的值.aggregate(matrix, grouping, f):类似于by,但不是将输出打印得很漂亮,而是将所有内容都粘贴到数据帧中.侧问题:我还没有学会plyr或重塑-将plyr或reshape更换所有这些完全?
假设我有一个by 2矩阵和一个函数,它将一个2向量作为其参数之一.我想将函数应用于矩阵的每一行并得到一个n向量.在R中如何做到这一点?
例如,我想在三个点上计算2D标准正态分布的密度:
bivariate.density(x = c(0, 0), mu = c(0, 0), sigma = c(1, 1), rho = 0){
exp(-1/(2*(1-rho^2))*(x[1]^2/sigma[1]^2+x[2]^2/sigma[2]^2-2*rho*x[1]*x[2]/(sigma[1]*sigma[2]))) * 1/(2*pi*sigma[1]*sigma[2]*sqrt(1-rho^2))
}
out <- rbind(c(1, 2), c(3, 4), c(5, 6))
Run Code Online (Sandbox Code Playgroud)
如何将功能应用到每一行out?
如何以指定的方式将除了点之外的其他参数的值传递给函数?
我正在尝试获取大型数据框中每列的最小值/最大值,作为了解我的数据的一部分.我的第一次尝试是:
apply(t,2,max,na.rm=1)
Run Code Online (Sandbox Code Playgroud)
它将所有内容视为字符向量,因为前几列是字符类型.所以一些数字列的最大值出来了" -99.5".
然后我尝试了这个:
sapply(t,max,na.rm=1)
Run Code Online (Sandbox Code Playgroud)
但它抱怨最大因素没有意义.(lapply是一样的.)令我困惑的是,apply思想max对于因素非常有意义,例如它为第1列返回了"ZEBRA".
顺便说一下,我看了一下在POSIXct矢量上使用sapply,其中一个答案是" 当你使用sapply时,你的对象被强制为数字,...... ".这是发生在我身上的事吗?如果是这样,是否有一个不强制的替代应用功能?当然这是一个常见的需求,因为数据框类型的一个关键特征是每列可以是不同的类型.
我有一个数字向量列表,我想将它们组合成一个向量.但我无法做到这一点.该列表可以在列表元素中具有一个共同的元素.最终的矢量不应该添加两次.这是一个例子:
>lst
`1`
[1] 1 2
`2`
[2] 2 4 5
`3`
[3] 5 9 1
Run Code Online (Sandbox Code Playgroud)
我想要最终结果
>result
[1] 1 2 4 5 9 1
Run Code Online (Sandbox Code Playgroud)
我试着做以下事情,而不用担心重复:
>vec<-vector()
>sapply(lst, append,vec)
Run Code Online (Sandbox Code Playgroud)
和
>vec<-vector()
>sapply(lst, c, vec)
Run Code Online (Sandbox Code Playgroud)
他们都没有工作.有人可以帮我吗?
谢谢.
我有一个相当简单的任务,但没有找到一个好的解决方案.
> mylist
[[1]]
[1] 1 2 3 4 5 6 7 8 9 10
[[2]]
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"
[[3]]
[1] 25 26 27 28 29 30 31 32
y <- c(3,5,9)
Run Code Online (Sandbox Code Playgroud)
我想从提取MYLIST子元素3,5和列表中的每个组件的9.我试过了,sapply[mylist,"[[",y]但没有运气!和其他人喜欢vapply,lapply等等.提前感谢您的帮助
Mauricio Ortiz
可能重复:
如何将函数应用于R中矩阵(或数据帧)的每一行
我想将一个函数应用于数据框中的每一行,但是,R默认将它应用于每一列.我怎么强迫它呢?
> a = as.data.frame(list(c(1,2,3),c(10,0,6)),header=T)
> a
c.1..2..3. c.10..0..6.
1 1 10
2 2 0
3 3 6
> sapply(a,min)
c.1..2..3. c.10..0..6.
1 0
Run Code Online (Sandbox Code Playgroud)
我想要类似的东西
1 2
2 0
3 3
Run Code Online (Sandbox Code Playgroud) 我有一个带有列的数据框,当作为字符串连接(行方式)时,将允许我将数据框分区为所需的形式.
> str(data)
'data.frame': 680420 obs. of 10 variables:
$ A : chr "2011-01-26" "2011-01-26" "2011-02-09" "2011-02-09" ...
$ B : chr "2011-01-26" "2011-01-27" "2011-02-09" "2011-02-10" ...
$ C : chr "2011-01-26" "2011-01-26" "2011-02-09" "2011-02-09" ...
$ D : chr "AAA" "AAA" "BCB" "CCC" ...
$ E : chr "A00001" "A00002" "B00002" "B00001" ...
$ F : int 9 9 37 37 37 37 191 191 191 191 ...
$ G : int NA NA NA NA NA NA NA …Run Code Online (Sandbox Code Playgroud) 在文档中sapply,replicate有关于使用的警告...
现在,我可以接受它,但想了解它背后的原因.所以我创造了这个小小的人为例子:
innerfunction<-function(x, extrapar1=0, extrapar2=extrapar1)
{
cat("x:", x, ", xp1:", extrapar1, ", xp2:", extrapar2, "\n")
}
middlefunction<-function(x,...)
{
innerfunction(x,...)
}
outerfunction<-function(x, ...)
{
cat("Run middle function:\n")
replicate(2, middlefunction(x,...))
cat("Run inner function:\n")
replicate(2, innerfunction(x,...))
}
outerfunction(1,2,3)
outerfunction(1,extrapar1=2,3)
outerfunction(1,extrapar1=2,extrapar2=3)
Run Code Online (Sandbox Code Playgroud)
也许我已经做了一些明显可怕的错误,但我发现这个结果令人不安.所以任何人都可以向我解释为什么在上面的所有调用中outerfunction,我得到了这个输出:
Run middle function:
x: 1 , xp1: 0 , xp2: 0
x: 1 , xp1: 0 , xp2: 0
Run inner function:
x: 1 , xp1: 0 , xp2: 0
x: 1 , xp1: 0 …Run Code Online (Sandbox Code Playgroud) 我正在尝试提取列表中每个元素的第二个子元素,同时忽略R中的NA.这是一个小例子:
mylist <- list(a=c(6,7),b=NA,c=c(8,9))
sapply(mylist, "[[", 1)
sapply(mylist, "[[", 2) #receive error
Run Code Online (Sandbox Code Playgroud)
因为元素'b'只有一个子元素(NA),所以在尝试提取第二个子元素时收到以下错误:
Error in FUN(X[[2L]], ...) : subscript out of bounds
Run Code Online (Sandbox Code Playgroud)
我的目标是输出为:7,NA,9.换句话说,我想忽略并保留NA,以便输出与列表中元素的数量相同.我希望解决方案足够通用,也可以将它应用于每个列表中的不同子元素n.
我创建了一个包含3个变量的数据帧"杀手".尽管存在NA整个值,但数据是数字的.
我的目标是计算3个变量中每个变量的均值.
sapply(killers, function(x) median)
Run Code Online (Sandbox Code Playgroud)
返回:
$heartattack
function (x, na.rm = FALSE)
UseMethod("median")
<bytecode: 0x103748108>
<environment: namespace:stats>
Run Code Online (Sandbox Code Playgroud)
我知道这个na.rm论点是忽视NA价值观的一种手段.由于na.rm = FALSE存在于R返回的内容中,因此可以假设有一种方法可以将其设置TRUE为上面的代码行.我尝试了一些变化:
sapply(killers, na.rm=TRUE function(x) median)
sapply(killers, function(x) median, na.rm=TRUE)
sapply(killers, function(x) median(na.rm=TRUE))
Run Code Online (Sandbox Code Playgroud)
我不确定我是否接近或者是否会涉及嵌套功能,因为其他类似的(尽管在这个实例中我最终没有帮助)我会在SO主题上发布帖子.例如, 如何将na.rm作为参数传递给tapply?, 忽略NA的功能
当然,我可以计算用于创建杀手的每个向量的均值,但是如果我问的是可能的话那就更好了.