簡體   English   中英

如何將函數應用於R中向量的每個元素

[英]How to apply a function to each element of a vector in R

假設我想將向量的每個偶數元素乘以2,將向量的每個奇數元素乘以3.以下是一些可以執行此操作的代碼:

v <- 0:10

idx <- v %% 2 == 0
v[idx] <- v[idx] * 2
v[!idx] <- v[!idx] * 3

如果我有兩個以上的案例,這將變得困難。 看起來應用函數系列從不處理向量,所以我不知道更好的方法來解決這個問題。 如果我對數據進行了轉換,那么使用apply函數可能會有效,但似乎不應該是我需要做的事情來解決這個簡單的問題。

有任何想法嗎?

編輯:抱歉混亂。 我對“%%”運算符並不特別感興趣。 我想在我的問題中提出一些具體的代碼,但是,根據對問題的回答,這個代碼太具體了。 我想弄清楚如何將一些任意函數應用於列表的每個成員。 使用apply()是不可能的,我認為sapply()只適用於列表。

你可以做:

v <- v * c(2, 3)[v %% 2 + 1]

它可以推廣到任何v %% n ,例如:

v <- v * c(2, 3, 9, 1)[v %% 4 + 1]

此外,它不要求length(v)n的倍數。

您可以使用矢量乘法來執行您想要的操作:

tmp <- 1:10
tmp * rep(c(3,2), length(tmp)/2)

這很容易擴展到三種或更多種情況:

tmp * rep(c(3,2,4), length(tmp)/3)

最容易的是:

v*c(2,3) # as suggested by flodel in a comment.

在文檔中搜索的術語是“參數回收”...... R語言的一個特性。 僅適用於二元中綴函數(請參閱?Ops )。 對於非dyadcic矢量化函數,它們不會因某些參數而出錯,而且你不能依賴於“v”的結構,那么你可以使用ifelse:

ifelse( (1:length(v)) %% 2 == 0, func1(v), func2(v) )

這構造了兩個向量,然后根據第一個參數的真值選擇第一個或第二個中的元素。 如果您試圖回答帖子標題中的問題,那么您應該看看:

?sapply

這是一個答案,允許任何一組任意函數應用於向量中的已定義組。

# source data
test <- 1:9
# categorisations of source data
cattest <- rep(1:3,each=3)
#[1] 1 1 1 2 2 2 3 3 3

使功能差異化應用功能:

categ <- function(x,catg) {
          mapply(
                 function(a,b) {
                                switch(b,
                                       a * 2,
                                       a * 3,
                                       a / 2
                                      )
                               },
                  x,
                  catg
                 )
         }
# where cattest = 1, multiply by 2
# where cattest = 2, multiply by 3
# where cattest = 3, divide by 2

結果:

categ(test,cattest)
#[1]  2.0  4.0  6.0 12.0 15.0 18.0  3.5  4.0  4.5

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM