![](/img/trans.png)
[英]How to paste a string on each element of a vector of strings using apply in 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.