R为列表的每个元素提供不同的功能

use*_*868 9 r function lapply

我有一个列表(在R中),其中元素是不同的数据类型,例如,第一个元素是数字,第二个元素是字符.我想对每个元素应用不同的函数.例如,在下面的代码中,我尝试仅将sum函数应用于第一个元素,将length函数仅应用于第二个元素.有没有办法将不同的函数应用于列表的每个元素(不分解列表)?

data <- list(
  A = rnorm(10),
  B = letters[1:10]
)

lapply(data, list(sum, length))

mapply(function(x) sum, length, data)
Run Code Online (Sandbox Code Playgroud)

MrF*_*ick 16

怎么样

mapply(function(a,b) b(a), data, list(sum, length))
Run Code Online (Sandbox Code Playgroud)

请注意,我们也将函数放在mapply列表中.


Fra*_*ank 6

我会做点什么的

sapply( data, function(x) (if(is.character(x)) length else sum)(x) )
Run Code Online (Sandbox Code Playgroud)

复杂的替代品.如果速度是一个问题,vapply应该更快:

vapply( data, function(x) (if(is.character(x)) length else sum)(x), numeric(1) )
Run Code Online (Sandbox Code Playgroud)

如果您需要length多次使用,它使用起来很快lengths(可在R 3.2.0+中使用):

res          <- lengths(data)
get_sum      <- !sapply(data,is.character)
res[get_sum] <- sapply(data[get_sum],sum)
Run Code Online (Sandbox Code Playgroud)