标签: sapply

分组函数(tapply,by,aggregate)和*apply系列

每当我想在R中做一些"map"py时,我通常会尝试使用一个函数 apply家族中.

但是,我从来没有完全理解它们之间的区别 - 如何{ sapply,lapply等}将函数应用于输入/分组输入,输出将是什么样的,甚至输入可以是什么 - 所以我经常只要仔细检查它们,直到我得到我想要的东西.

有人可以解释如何使用哪一个?

我当前(可能不正确/不完整)的理解是......

  1. sapply(vec, f):输入是一个向量.output是一个向量/矩阵,其中element if(vec[i])一个矩阵,如果f有一个多元素输出

  2. lapply(vec, f):相同sapply,但输出是一个列表?

  3. apply(matrix, 1/2, f):输入是一个矩阵.output是一个向量,其中element i是f(矩阵的row/col i)
  4. tapply(vector, grouping, f):output是一个矩阵/数组,其中矩阵/数组中的元素是向量f分组g的值,和g被推送到行/列名称
  5. by(dataframe, grouping, f):让我们g成为一个分组.适用f于组/数据框的每一列.漂亮打印分组和f每列的值.
  6. aggregate(matrix, grouping, f):类似于by,但不是将输出打印得很漂亮,而是将所有内容都粘贴到数据帧中.

侧问题:我还没有学会plyr或重塑-将plyrreshape更换所有这些完全?

r lapply sapply r-faq tapply

1011
推荐指数
10
解决办法
39万
查看次数

将函数应用于矩阵或数据框的每一行

假设我有一个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

如何以指定的方式将除了点之外的其他参数的值传递给函数?

r function matrix apply sapply

114
推荐指数
5
解决办法
22万
查看次数

将函数应用于数据框中的每个列,观察每个列的现有数据类型

我正在尝试获取大型数据框中每列的最小值/最大值,作为了解我的数据的一部分.我的第一次尝试是:

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时,你的对象被强制为数字,...... ".这是发生在我身上的事吗?如果是这样,是否有一个不强制的替代应用功能?当然这是一个常见的需求,因为数据框类型的一个关键特征是每列可以是不同的类型.

r apply sapply

49
推荐指数
3
解决办法
12万
查看次数

R +将矢量列表组合成单个矢量

我有一个数字向量列表,我想将它们组合成一个向量.但我无法做到这一点.该列表可以在列表元素中具有一个共同的元素.最终的矢量不应该添加两次.这是一个例子:

>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)

他们都没有工作.有人可以帮我吗?

谢谢.

r list vector append sapply

47
推荐指数
4
解决办法
4万
查看次数

如何从R中的列表中进行子集化

我有一个相当简单的任务,但没有找到一个好的解决方案.

> 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 list sapply

29
推荐指数
4
解决办法
7万
查看次数

将函数应用于R中数据框中的每一行

可能重复:
如何将函数应用于R中矩阵(或数据帧)的每一行

R - 如何使用df的每一行中的多个参数在每行数据帧上调用类似应用的函数

我想将一个函数应用于数据框中的每一行,但是,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)

r dataframe sapply

26
推荐指数
1
解决办法
6万
查看次数

跨数据帧的特定列逐行连接

我有一个带有列的数据框,当作为字符串连接(行方式)时,将允许我将数据框分区为所需的形式.

> 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)

r string-concatenation paste apply sapply

26
推荐指数
3
解决办法
5万
查看次数

使用"..."和"复制"

在文档中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 ellipsis replicate sapply

19
推荐指数
2
解决办法
6322
查看次数

提取列表中每个元素的第二个子元素,同时忽略R中的sapply中的NA

我正在尝试提取列表中每个元素的第二个子元素,同时忽略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.

r list apply sapply na

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

在计算中位数时如何将na.rm = TRUE传递给sapply?

我创建了一个包含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的功能

当然,我可以计算用于创建杀手的每个向量的均值,但是如果我问的是可能的话那就更好了.

r sapply na na.rm

14
推荐指数
1
解决办法
2万
查看次数