用R處理一組資料的三種方式

2022-02-01 12:40:37 字數 1599 閱讀 9169

usarrests是r附帶的乙個資料集,現在我們需要建立乙個factor向量urbancat,如果urbanpop列的某個值在中位數之上,就把urbancat對應位置的值設為1,否則設為0。

這種資料處理任務實在太簡單了,乙個for迴圈就能搞定。首先,我們計算一下urbanpop的中位數:

urbanpop.median <- median(usarrests$urbanpop)

然後,用rep函式初始化乙個等長的urbancat向量:

urbancat <- rep(x = 0, times = length(usarrests$urbanpop))

接著,用for迴圈為urbancat設定對應位置的值:

for (i in 1:length(urbancat)) 

}

以上**對於擁有命令式程式設計背景的同學來說是非常親切自然的。值的提醒的是,如果urbancat的長度有可能為0,那麼使用1:length(urbancat)可能會有非預期結果(你可以試一下),這個時候我們建議把1:length(urbancat)換成seq_along(urbancat)。

對於擁有函式式程式設計背景的同學,可以使用purrr的map函式:

library(purrr)

urbancat <- map_dbl(usarrests$urbanpop, function(x) if (x > urbanpop.median) 1 else 0)

urbancat <- map_dbl(usarrests$urbanpop, ~ if (.x > urbanpop.median) 1 else 0)

這裡的.x表示map_dbl傳給你的urbanpop列的某個值。

在接觸r之前,我基本上都會選擇fp的做法,但在接觸r之後,我被它的向量化運算以及通過邏輯值取子集(logical subsetting)的做法深深吸引:

urbancat[usarrests$urbanpop > urbanpop.median] <- 1

usarrests$urbanpop是乙個向量,而urbanpop.median是乙個值,因為r預設支援向量化運算,所以拿usarrests$urbanpop和urbanpop.median比較會自動轉化成拿usarrests$urbanpop裡的每個值和urbanpop.median,得到乙個和usarrests$urbanpop等長的由邏輯值(t和f)組成的向量(f f t f t ......)。當我們用這個邏輯值向量去索引urbancat時,就會取出邏輯值為t的對應元素,這個時候,結合賦值運算就可以把這些元素都設為1了。

最後,要把urbancat變成factor向量,你可以修改for迴圈或者map函式,但在r裡,你只需把urbancat傳給factor函式就行了:

urbancat <- factor(urbancat)

ruby之父松本行弘在他的《松本行弘的程式世界》裡說過,「在語言學領域裡,有乙個sapir-whirf假說,認為語言可以影響說話者的思想。也就是說,語言的不同,造成了思想的不同。程式設計師由於使用的程式語言不同,他的思考方法和編寫出來的**都會受到程式語言的很大影響。」而這番話可以很好地概括我此時的感受。

用R處理一組資料的三種方式

usarrests是r附帶的乙個資料集,現在我們需要建立乙個factor向量urbancat,如果urbanpop列的某個值在中位數之上,就把urbancat對應位置的值設為1,否則設為0。這種資料處理任務實在太簡單了,乙個for迴圈就能搞定。首先,我們計算一下urbanpop的中位數 urbanp...

Session的三種處理方式

簡單來說,session就是伺服器給客戶端的乙個編號,當一台web伺服器執行時,可能 是有多個使用者都在瀏覽這台伺服器上的 當每個使用者首次與這台伺服器建立連線時,它就與這個伺服器建立了乙個session,同時伺服器就會自動為其分 配乙個sessionid,用以標識這個使用者的唯一身分,這個sess...

GridView顯示資料的三種方式(一)

gridview控制項顯示查詢的資料。介紹一下其顯示的方式。1 自動生成字段。這種方式簡單,只要繫結資料來源即可。若是沒有資料來源,首先新建資料來源 這種方法,完全是手動連線,而不需要 控制。但是這種情況缺點不靈活,不能根據使用者的意願而進行排列 使用者顯示的不希望按照資料庫順序顯示,那這種自動生成...