激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

香港云服务器
服務器之家 - 編程語言 - R語言 - R語言中do.call()的使用說明

R語言中do.call()的使用說明

2022-01-07 15:03XIUXIU179 R語言

這篇文章主要介紹了R語言中do.call()的使用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

簡單參數(shù)設置就能搞定的事情,是不會用到do.call的。

在運用R的過程中總會碰到這樣一類函數(shù),它們接受的參數(shù)數(shù)量可以是任意的,該函數(shù)會處理這些參數(shù),并返回處理結果。

最簡單的例子就是data.frame

比如:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
> x1 = 1:10
> x2 = 11:20
> x3 = 21:30
> data.frame(x1,x2,x3)
   x1 x2 x3
1   1 11 21
2   2 12 22
3   3 13 23
4   4 14 24
5   5 15 25
6   6 16 26
7   7 17 27
8   8 18 28
9   9 19 29
10 10 20 30

你可以在data.frame函數(shù)中加入任意多的向量參數(shù)(x1,x2,x3都是向量)。

不過現(xiàn)在的情況是:你明確知道你僅將這三個向量拼湊成一個數(shù)據(jù)框就行了,那么,你寫成data.frame(x1,x2,x3)是最好的方法,沒必要寫成如下的方式:

?
1
2
3
4
5
6
7
8
9
10
11
12
> do.call("data.frame",list(x1,x2,x3))
   X1.10 X11.20 X21.30
1      1     11     21
2      2     12     22
3      3     13     23
4      4     14     24
5      5     15     25
6      6     16     26
7      7     17     27
8      8     18     28
9      9     19     29
10    10     20     30

不過,假設你遇到的情況是這樣:你現(xiàn)在需要從磁盤上的某個文件中讀入所有行次的數(shù)據(jù),但是隨情況變化,文件的長度會發(fā)生改變。

可是你打算編寫一個能同時應對各種長度文件的程序,程序目的是將文件中各行的內容豎過來,按列組成一個數(shù)據(jù)框。

那么請問你有哪些方法?——read.table()+t(),好吧,我承認我又輸了,看來do.call還不是最好的選項。

那么如果這個文件各行的類型不同呢?比如一行字符,一行數(shù)字,一行布爾值,如此循環(huán)延伸,你又能怎么辦?

?
1
2
3
4
5
6
7
8
9
10
11
f = file("abc.txt", "r")
n = length(count.fields("abc.txt")) / 3
l = list()
for (i in 1:n) {
        l[[(i-1)*3 + 1]] = scan(file = f, sep = ",", nlines = 1, what = "", quiet = TRUE)
        l[[(i-1)*3 + 2]] = scan(file = f, sep = ",", nlines = 1, what = 0, quiet = TRUE)
        l[[(i-1)*3 + 3]] = scan(file = f, sep = ",", nlines = 1, what = TRUE, quiet = TRUE)
}
names(l) = paste("l", 1:length(l), sep = "")
r = do.call("data.frame", l)
print(r)

仍然有替代方案:

(1)我就用read.table()+t(),大不了事后再按列轉換類型!

(2)仍然是上述循環(huán),我不要每次都把值押入list中,我直接創(chuàng)建data.frame,之后再用cbind()逐列添加,這樣就用不著do.call了

那么現(xiàn)在再次提高難度:取消轉置函數(shù)t()的使用,不允許使用cbind()函數(shù)。那么你只能用do.call了。

我其實一點都不蠻橫,只要換一種情境即可——ffbase包,專門處理大數(shù)據(jù)的擴展包,其中ffdf對象與data.frame類似(不過可容納更多數(shù)據(jù)),但不容易增添新列,且無法轉置!ffdf函數(shù)是什么你不需要知道,你只要知道它也可以添加任意多的參數(shù)即可。

好吧,下面就是一個涉及ffbase包的程序片段

來感受一下do.call的用法吧:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
addStrategyData <- function(detailList, index) {
 
  a = list()
  x = detailList[[index]]
  vMode = sapply(names(x), function(y) switch(y,
      "s" = "integer",
      "t" = "double",
      "f" = "logical"))
                                              
  names(vMode) = names(x)
  x = as.ffdf(x, vmode = vMode)
 
  for (i in 1:ncol(x)) a[[i]] = x[[i]]
  for (i in (length(a) + 1:length(detailList))) a[[i]] = ff(FALSE, length = nrow(x), vmode = "logical")
  a[[ncol(x) + index]] = ff(TRUE, length = nrow(x), vmode = "logical")
  names(a) = c(names(x), paste("S", 1:length(detailList), sep = ""))
  return(do.call("ffdf", a))
}

某些情況下,你知道某個函數(shù)接受參數(shù)的明確個數(shù),但是太多了,你懶,所以用do.call;但更多的情況是你迫不得已,必須用它。

補充:R中的LAPPLY和DO.CALL有什么區(qū)別?

最近我在學習R,兩個函數(shù)lapply和do.call混淆了。 看起來,它們和Lisp中的map函數(shù)類似。 但是為什么有兩個不同的名字呢? 為什么R不使用稱為map的函數(shù)?

有一個稱為Map的function,可能與其他語言的地圖類似:

lapply

返回與X相同長度的列表,其中每個元素都是將FUN應用于X的對應元素的結果。

do.call

構造并執(zhí)行一個函數(shù)調用,從一個名字或一個函數(shù)和一個參數(shù)列表傳遞給它。

Map將一個函數(shù)應用到給定vector的相應元素… Map是一個簡單的mapply包裝,它不會試圖簡化結果,類似于Common Lisp的mapcar(但是參數(shù)被回收)。 未來的版本可能允許對結果types進行一些控制。

1、Map是mapply的包裝

2、lapply是mapply

3、因此在許多情況下Map和lapply將是相似的。

例如,這里是lapply :

?
1
lapply(iris, class) $Sepal.Length [1] "numeric" $Sepal.Width [1] "numeric" $Petal.Length [1] "numeric" $Petal.Width [1] "numeric" $Species [1] "factor"

和使用Map :

?
1
Map(class, iris) $Sepal.Length [1] "numeric" $Sepal.Width [1] "numeric" $Petal.Length [1] "numeric" $Petal.Width [1] "numeric" $Species [1] "factor"

do.call采用一個函數(shù)作為input,并將其他參數(shù)潑到函數(shù)上。 例如,它被廣泛用于將列表組裝成更簡單的結構(通常使用rbind或cbind )。

例如:

?
1
x <- lapply(iris, class) do.call(c, x) Sepal.Length Sepal.Width Petal.Length Petal.Width Species "numeric" "numeric" "numeric" "numeric" "factor"

lapply在列表上應用一個函數(shù), do.call用參數(shù)列表調用一個函數(shù)。 這對我來說看起來很不一樣

用列表舉個例子:

?
1
X <- list(1:3,4:6,7:9)

用lapply你可以得到列表中每個元素的意思:

?
1
> lapply(X,mean) [[1]] [1] 2 [[2]] [1] 5 [[3]] [1] 8

do.call給出一個錯誤,正如意味著參數(shù)“trim”為1。

另一方面, rbind綁定所有參數(shù)。 所以綁定X行,你做:

?
1
> do.call(rbind,X) [,1] [,2] [,3] [1,] 1 2 3 [2,] 4 5 6 [3,] 7 8 9

如果你使用lapply ,R會將rbind應用于列表中的每一個元素,給你這個廢話:

?
1
> lapply(X,rbind) [[1]] [,1] [,2] [,3] [1,] 1 2 3 [[2]] [,1] [,2] [,3] [1,] 4 5 6 [[3]] [,1] [,2] [,3] [1,] 7 8 9

要有像Map這樣的東西,你需要?mapply ,這是完全不同的東西。 為了得到例如X中每個元素的平均值,但是使用不同的修整,可以使用:

?
1
> mapply(mean,X,trim=c(0,0.5,0.1)) [1] 2 5 8

lapply與map類似, do.call不是。 lapply將函數(shù)應用于列表的所有元素, do.call調用一個函數(shù),其中所有的函數(shù)參數(shù)都在列表中。 所以對于一個n元素列表, lapply有n函數(shù)調用, do.call只有一個函數(shù)調用。 所以do.call與lapply完全不同。 希望這個澄清你的問題。

一個代碼示例:

?
1
do.call(sum, list(c(1,2,4,1,2), na.rm = TRUE))

和:

?
1
lapply(c(1,2,4,1,2), function(x) x + 1)

用最簡單的話來說:

lapply()為列表中的每個元素應用一個給定的函數(shù),所以會有幾個函數(shù)調用。

do.call()將給定的函數(shù)作為一個整體應用于列表,所以只有一個函數(shù)調用。

最好的學習方法是在R文檔中使用函數(shù)示例。

lapply()是一個類似地圖的函數(shù)。 do.call()是不同的。 它用于將parameter passing給列表forms的函數(shù),而不是枚舉它們。 例如,

?
1
> do.call("+",list(4,5)) [1] 9

雖然有很多答案,這里是我的例子供參考。 假設我們有一個數(shù)據(jù)列表:

?
1
L=list(c(1,2,3), c(4,5,6))

函數(shù)lapply返回一個列表。

?
1
lapply(L, sum)

上面的意思就像下面這樣。

?
1
list( sum( L[[1]]) , sum( L[[2]]))

現(xiàn)在讓我們?yōu)閐o.call做同樣的事情

?
1
do.call(sum, L)

它的意思是

?
1
sum( L[[1]], L[[2]])

在我們的例子中,它返回21.總之,lapply總是返回一個列表,而do.call的返回types實際上取決于執(zhí)行的函數(shù)。

兩者的區(qū)別是:

?
1
lapply(1:n,function,parameters)

=>這個發(fā)送1,參數(shù)到function=>這個發(fā)送2,參數(shù)到function等等

?
1
do.call

只需發(fā)送1 … n作為一個向量和參數(shù)來運行

所以在應用你有n個函數(shù)調用,在do.call中你只有一個

我覺得在這方面一個重要的方面沒有得到certificate(或對我來說不明顯)。 也就是說,您可以使用do.call將list中的命名parameter passing給函數(shù)。

例如, runif需要參數(shù)n , min和max 。 可以使用do.call來傳遞這些信息,如下所示。

?
1
para <- list(n = 10, min = -1, max = 1) do.call(runif, para) #[1] -0.4689827 -0.2557522 0.1457067 0.8164156 -0.5966361 0.7967794 #[7] 0.8893505 0.3215956 0.2582281 -0.8764275

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持服務器之家。如有錯誤或未考慮完全的地方,望不吝賜教。

原文鏈接:https://blog.csdn.net/XIUXIU179/article/details/80752723

延伸 · 閱讀

精彩推薦
  • R語言R語言中qplot()函數(shù)的用法說明

    R語言中qplot()函數(shù)的用法說明

    這篇文章主要介紹了R語言中qplot()函數(shù)的用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    Jack_丁明12752022-01-05
  • R語言R語言gsub替換字符工具的具體使用

    R語言gsub替換字符工具的具體使用

    這篇文章主要介紹了R語言gsub替換字符工具的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友...

    lztttao10372021-12-24
  • R語言R語言實現(xiàn)支持向量機SVM應用案例

    R語言實現(xiàn)支持向量機SVM應用案例

    本文主要介紹了R語言實現(xiàn)支持向量機SVM應用案例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    一天_pika5222022-01-18
  • R語言如何用R語言繪制散點圖

    如何用R語言繪制散點圖

    這篇文章主要介紹了如何用R語言繪制散點圖,幫助大家更好的理解和學習使用R語言,感興趣的朋友可以了解下...

    菜鳥教程13002021-12-23
  • R語言R語言常量知識點總結

    R語言常量知識點總結

    在本篇文章里小編給大家整理了一篇關于R語言常量知識點總結內容,有興趣的朋友們可以學習分享下。...

    R語言教程網(wǎng)12102021-12-29
  • R語言R語言讀取xls與xlsx格式文件過程

    R語言讀取xls與xlsx格式文件過程

    這篇文章主要為大家介紹了使用R語言讀取xls與xlsx格式文件的過程步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪...

    Kanny廣小隸11982022-01-20
  • R語言R語言中的vector(向量),array(數(shù)組)使用總結

    R語言中的vector(向量),array(數(shù)組)使用總結

    這篇文章主要介紹了R語言中的vector(向量),array(數(shù)組)使用總結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要...

    A葉子葉來5772021-11-14
  • R語言基于R/RStudio中安裝包“無法與服務器建立連接”的解決方案

    基于R/RStudio中安裝包“無法與服務器建立連接”的解決方案

    這篇文章主要介紹了基于R/RStudio中安裝包“無法與服務器建立連接”的解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    truffle52815052022-01-05
926
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 国产精品jk白丝蜜臀av软件 | 国产成视频在线观看 | av在线电影网址 | 久久综合入口 | 免费毛片在线视频 | 91福利免费视频 | 黄色网址在线免费播放 | 九九热在线视频观看 | 午夜视频大全 | 亚洲国产色婷婷 | 成人激情在线观看 | 看国产一级毛片 | 第四色成人网 | 国产精品视频自拍 | 在线成人影视 | chinesexxxx刘婷hd 国产91在线播放九色 | 精品一区二区三区欧美 | 性盈盈盈影院 | 精品国产一区二区三区在线 | 国产三级在线视频观看 | 1区2区3区国产 | 欧美不卡三区 | 中文国产在线视频 | 国产一级小视频 | 久久最新免费视频 | 午夜精品久久久久久久99热浪潮 | 99国产精品自拍 | 一区二区三区四区国产精品视频 | 国产精品久久久久久久久久三级 | 中文字幕在线播放视频 | 国产视频在线观看一区二区三区 | 成人国产在线看 | 成人午夜在线观看视频 | 国产精品久久久久久久午夜片 | 日日摸夜夜添夜夜添牛牛 | 午夜精品网站 | 孕妇体内谢精满日本电影 | 久久综合九色综合久久久精品综合 | av免费在线播放网址 | 蜜桃精品视频 | 亚洲综合视频在线播放 |