2015-06-17 71 views
0

我需要從R中的每個列表元素中減去指定的值。在this文章中提到,對於這樣的任務,使用apply系列函數代替循環。我試過以下:減去R中每個列表元素的值

# 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的東西可能有關,但我並沒有弄清楚的東西,從如何工作的發佈代碼片段。

+3

'了'不是'list'。嘗試'typeof(a)'或'class(a)'。 –

回答

8

減法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功能。

+0

我可以問什麼時候應該使用*應用家庭功能? –

+0

@WakanTanka我相信apply函數對r中真正的列表類型對象很有用。 dataframes和data.tables是基於列表的對象的兩個例子。 – icj

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

相關問題