我需要从R中的每个列表元素中减去指定的值。在this文章中提到,对于此类任务,使用apply
系列函数而不是循环。我试过以下:
# Define list
> a = 1:20
# Substraact this from each element
> substract_me = 5
# Function for substracting
> substract = function(x,y) { ret = x-y; return(ret) }
# The problem is that I do not know how to access the current array element and pass it to substract function
lapply(a, substract)
Here提到匿名函数也可以使用,但它对我没有用,我得到语法错误。事实上,它看起来就像语法糖一样。问题仍然存在,我在使用lapply
函数时需要一些占位符或其他东西,因此我可以访问当前的列表元素:
lapply(a, function([WHAT TO ADD HERE???],substract_me) substract([WHAT TO ADD HERE???],substract_me))
Here可能是相关的,但我没有弄清楚过去的代码片段中的内容是如何工作的。
答案 0 :(得分:10)
R中的减法是矢量化的
a = 1:20
substract_me = 5
a - substract_me
# [1] -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
此处无需apply
个功能。
答案 1 :(得分:1)
原始问题的标题询问如何将减法应用于列表类型r对象,但给定的示例从向量a = 1:20
中减去。
MrFlick批准的答案对于向量来说是完全正确的,但不适用于列表。例如,从以下整数向量列表中减去失败。
a <- list(v1 = 1:10, v2 = -5:5, v3 = 1:5)
# $v1
# [1] 1 2 3 4 5 6 7 8 9 10
# $v2
# [1] -5 -4 -3 -2 -1 0 1 2 3 4 5
# $v3
# [1] 1 2 3 4 5
subtract_me <- 5
a - subtract_me # produces a non-numeric argument to binary operator error
使用内联定义的匿名函数进行lapply是在列表上完成所需减法的简单方法。
lapply(a, function(x, subt_amnt) x - subt_amnt, subt_amnt = subtract_me)
# $v1
# [1] -4 -3 -2 -1 0 1 2 3 4 5
# $v2
# [1] -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0
# $v3
# [1] -4 -3 -2 -1 0
减法函数可以在lapply之外定义。错误处理和函数中的其他检查可能需要一个独立的功能。
有关匿名函数使用的更多信息,请参阅http://adv-r.had.co.nz/Functional-programming.html#anonymous-functions