首先,我使用了一個for回圈來處理一個數字向量,效果不錯。
當我使用lapply方法時,結果不是我想要的。我只想要一個串列中的一個元素。
這是我的例子。
這是我的例子
這是我的例子。
# 使用for回圈,結果是一個數字的向量。
x <- c(0.2,0。 5,0.03,0. 006,0.08)
p.value <- NULL
for (i in 1: length(x)){
if(x[i] > /span> 0. 5 p. value[i] < - (1- x[i])*2
else p. value[i] < - x[i]* 2
# with lapply
lapply(x, function(x) {if(x > 0. 5)p. value < - (1- x)*2 else p. value <- x*2。
lapply的結果是相同結果的組合。我有點意識到這個問題,但我不知道如何改變我的代碼。對此有什么建議嗎?
uj5u.com熱心網友回復:
這個問題可以用矢量的方式解決,所以你不需要for回圈或lapply。
p.value <- ifelse(x >/span> 0. 5, (1 - x)。 x) * 2
lapply代碼確實給了我for回圈的預期輸出,但你可以改變一些東西。
- 使用
for回圈。 - 使用
sapply,因為輸出是一個矢量 。
- 將
p.value賦值在sapply之外,而不是在函式內部。 - 由于你已經有了一個名為
x的向量,在匿名函式中改變變數為另一個名字。
p. value < - sapply(x, function(y) if(y >。 0. 5) (1-y)*2 else y*2)
uj5u.com熱心網友回復:
你可以使用replace,它比ifelse更快。
replace(x, x > . 5, 1 - x)*2
# [1] 0.400 1.000 0.060 0.012 0.160
基準
x < - sample(x, 1e6。 replace=T)
microbenchmark:: microbenchmark(ifelse=ifelse(x > 0。 5, (1 - x)。 x) * 2,
replace=replace(x, x > . 5, 1 - x)* 2)
# Unit: milliseconds
# expr min lq mean median uq max neval cld
# ifelse 25.049546 31.29303 39.53500 36.23981 42.06574 124.9903 100 b
# replace 8.074329 11.06676 18.68296 14.02976 16.99336 100.2051 100 a/span>
uj5u.com熱心網友回復:
嘗試用sapply代替lapply.這樣可以簡化串列的解決方案
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/328908.html
標籤:
