从R中的每个列表元素中减去值

时间:2015-06-17 18:35:30

标签: r

我需要从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可能是相关的,但我没有弄清楚过去的代码片段中的内容是如何工作的。

2 个答案:

答案 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