R lapply 对列表的每个元素的不同功能
R lapply different function to each element of list
我有一个列表(在 R 中),其中元素是不同的数据类型,例如,第一个元素是数字,第二个元素是字符。我想对每个元素应用不同的功能。例如,在下面的代码中,我尝试将 sum 函数仅应用于第一个元素,将 length 函数仅应用于第二个元素。有没有办法对列表的每个元素应用不同的函数(不分解列表)?
data <- list(
A = rnorm(10),
B = letters[1:10]
)
lapply(data, list(sum, length))
mapply(function(x) sum, length, data)
怎么样
mapply(function(a,b) b(a), data, list(sum, length))
请注意,我们也将 mapply
中的函数放在列表中。
我会做类似的事情
sapply( data, function(x) (if(is.character(x)) length else sum)(x) )
复杂的选择。如果速度是一个问题,vapply
应该更快:
vapply( data, function(x) (if(is.character(x)) length else sum)(x), numeric(1) )
如果需要多次使用length
,使用lengths
(在R 3.2.0+中可用)速度很快:
res <- lengths(data)
get_sum <- !sapply(data,is.character)
res[get_sum] <- sapply(data[get_sum],sum)
我有一个列表(在 R 中),其中元素是不同的数据类型,例如,第一个元素是数字,第二个元素是字符。我想对每个元素应用不同的功能。例如,在下面的代码中,我尝试将 sum 函数仅应用于第一个元素,将 length 函数仅应用于第二个元素。有没有办法对列表的每个元素应用不同的函数(不分解列表)?
data <- list(
A = rnorm(10),
B = letters[1:10]
)
lapply(data, list(sum, length))
mapply(function(x) sum, length, data)
怎么样
mapply(function(a,b) b(a), data, list(sum, length))
请注意,我们也将 mapply
中的函数放在列表中。
我会做类似的事情
sapply( data, function(x) (if(is.character(x)) length else sum)(x) )
复杂的选择。如果速度是一个问题,vapply
应该更快:
vapply( data, function(x) (if(is.character(x)) length else sum)(x), numeric(1) )
如果需要多次使用length
,使用lengths
(在R 3.2.0+中可用)速度很快:
res <- lengths(data)
get_sum <- !sapply(data,is.character)
res[get_sum] <- sapply(data[get_sum],sum)