日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

r语言清除变量_如何优雅地计算多变量 | R语言进阶

發布時間:2023/12/10 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 r语言清除变量_如何优雅地计算多变量 | R语言进阶 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

社會科學研究經常會遇到“超多變量”的情況——多量表、多維度、多題項,以及復雜的正反計分題……如何更高效地計算量表總分?如何更簡潔地進行反向計分?傳統的統計工具(Excel、SPSS等)雖然也能解決這些問題,但在超多變量的情況下會比較繁瑣。相反,R語言以其擴展包的強大功能和代碼的極簡風格,狂甩傳統軟件幾十條街。今天我們就來掌握如何使用R語言優雅地計算超多變量(包括計算總分、計算平均值、缺失值處理、數值計數、重新編碼、反向計分等)。

本文目錄:

  • 溫故——傳統軟件的解決辦法概覽
  • 知新——R語言和data.table包
  • 進階——自編R函數優雅計算多變量(附相關代碼)

  • 1 / 傳統軟件的解決辦法概覽

    我們以經典的10題Rosenberg自尊量表(RSES)為例,這是一個4點Likert量表(1-4),其中有5題反向計分(第3、5、8、9、10題)。

    如果用Excel來計算其總分或平均分,大家應該已經很熟悉了,可以分別用SUM和AVERAGE函數:比如從A列~J列是RSES的10道題,那么在K2格輸入“=AVERAGE(A2,B2,5-C2,D2,5-E2,F2,G2,5-H2,5-I2,5-J2)”,然后雙擊K2格右下角的黑色小十字,就自動填充算出了所有人的量表平均分。如果沒有反向計分題,會簡單很多,可以直接“=AVERAGE(A2:J2)”。想必這是大多數讀者再熟悉不過的方法。

    如果換做是SPSS,可能稍微復雜一點,比如原始變量名是RSES1、RSES2……RSES10,那么計算平均分可以先RECODE其中5道反向計分題并生成新變量再COMPUTE,也可以不RECODE直接COMPUTE(當然如果要計算信度,還是得先RECODE生成新變量):

    COMPUTE RSES=MEAN(RSES1, RSES2, 5-RSES3, RSES4, 5-RSES5, RSES6, RSES7, 5-RSES8, 5-RSES9, 5-RSES10). EXECUTE.

    同樣,在不涉及反向計分的情況下,SPSS的語句也能通過“to”(大小寫不敏感)得到簡化(但變量需要按順序排好):

    COMPUTE X=MEAN(X1 to X50). EXECUTE.

    如此看來,傳統方法似乎還比較方便,所以這可能也是目前很多同學或老師不愿意學習使用R的原因:原來的軟件已經夠用、學編程需要花費比較多的成本、不想寫代碼、畏懼寫代碼……或者,學著學著就“從入門到放棄”了……

    其實可以理解,畢竟我們有時候不太想跳出舒適區。

    然而,隨著變量增多,Excel和SPSS就會變得越來越不方便、越來越繁瑣。

    2 / R語言和data.table包

    R語言會極大提高數據分析的效率,并且可以做幾乎所有的統計分析。

    自從兩年前入坑R,我在一次次分析數據的過程中逐漸體會到R語言的美妙之處,無論是數據處理的簡潔程度、統計功能的強大程度,還是作圖的美觀程度。雖說一個心理學研究者并不必要掌握太多編程語言(不可否認,問題比方法更重要,想法比技術更重要),但R絕對是一個巨大的寶庫,經常會給我們很多驚喜,長遠來看也會節省我們很多時間和精力。

    在數據預處理方面,data.table作為data.frame的繼承和升級版,不僅在處理大容量數據的時候速度更快,而且在擁有強大功能的同時代碼設計卻非常優雅簡潔。官方速查手冊請參考data.table (cheat sheet)。

    data.table簡介

    data.table的基本使用方式是“data[i, j, by]”(i為行,j為列,by為分組變量)。下面是一些例子:

    require(data.table) data=data.table(x=rep(1:2, each=3), y=1:6, z=6:1) # x y z # 1: 1 1 6 # 2: 1 2 5 # 3: 1 3 4 # 4: 2 4 3 # 5: 2 5 2 # 6: 2 6 1# 篩選符合條件的行/個案 data[x==1 & y>1] # x y z # 1: 1 2 5 # 2: 1 3 4# 篩選特定的列/變量 data[, c("y", "z")] data[, .(y, z)] # y z # 1: 1 6 # 2: 2 5 # 3: 3 4 # 4: 4 3 # 5: 5 2 # 6: 6 1# 同時篩選行和列 data[y %between% c(2, 4), "z"] # z # 1: 5 # 2: 4 # 3: 3# 分組匯總 data[order(x), .(TotalN=.N, Ymean=mean(y), Zsd=sd(z), Zmax=max(z)), by=x] # x TotalN Ymean Zsd Zmax # 1: 1 3 2 1 6 # 2: 2 3 5 1 3# 變量計算(“原地更新”,無需賦值給新變量) data[, sum:=x+y+z] # x y z sum # 1: 1 1 6 8 # 2: 1 2 5 8 # 3: 1 3 4 8 # 4: 2 4 3 9 # 5: 2 5 2 9 # 6: 2 6 1 9# 多變量同時計算(“:=”實則為data.table的一個特殊函數) data[,":="(sum_xy=x+y,`y*z`=y*z)] # x y z sum sum_xy y*z # 1: 1 1 6 8 2 6 # 2: 1 2 5 8 3 10 # 3: 1 3 4 8 4 12 # 4: 2 4 3 9 6 12 # 5: 2 5 2 9 7 10 # 6: 2 6 1 9 8 6# 數據匹配合并(即merge) d1=data.table(x=letters[1:4], y=1:4) # x y # 1: a 1 # 2: b 2 # 3: c 3 # 4: d 4 d2=data.table(x=letters[3:1], z=1:3) # x z # 1: c 1 # 2: b 2 # 3: a 3 d2[d1, on="x"] # 保留d1所有case # x z y # 1: a 3 1 # 2: b 2 2 # 3: c 1 3 # 4: d NA 4 d1[d2, on="x"] # 保留d2所有case # x y z # 1: c 3 1 # 2: b 2 2 # 3: a 1 3

    通過上面這些簡單的例子,大家對data.table應該已經有了基本的感受——非常簡潔。事實上,如果要在data.frame實現相同的功能,還需要用到許多其他的函數和包(例如which、aggregate、merge,多變量計算則需要用到dplyr包的mutate等等),而在data.table里面,一切都變得非常優雅。

    然而,優雅才剛剛開始。

    3 / 自編R函數優雅計算多變量

    雖然data.table提供了“:=”函數使得多變量計算容易很多,但現實情況往往比較復雜,尤其是本文開頭所說的“超多變量”情況。頗為遺憾的是,data.table本身并沒有提供特別有效的函數來“優雅地”進行“超多變量”的計算。

    我們不妨先創建一個案例數據,用來模擬紛繁復雜的現實情況,這里我刻意把“x2”和“x4”的位置倒了過來,并且加了幾個缺失值NA:

    d=data.table(x1=1:5, x4=c(2,2,5,4,5), x3=c(3,2,NA,NA,5), x2=c(4,4,NA,4,5), x5=c(5,4,3,4,5)) # x1 x4 x3 x2 x5 # 1: 1 2 3 4 5 # 2: 2 2 2 4 4 # 3: 3 5 NA NA 3 # 4: 4 4 NA 4 4 # 5: 5 5 5 5 5# 如果要計算x1-x5的平均值: # (以下均為錯誤代碼!) d[,":="(X=mean(x1, x2, x3, x4, x5))] # 報錯 d[,":="(X=mean(c(x1, x2, x3, x4, x5)))] # 依然不對,返回值都是NA d[,":="(X=mean(c(x1, x2, x3, x4, x5), na.rm=TRUE))] # 還是不對,返回值都是同一個數字 d[,":="(X=(x1+x2+x3+x4+x5)/5)] # 回到了最笨的辦法,但缺失值依然無法處理

    可以看到,如果我們想計算x1-x5的平均值,想想容易,真正實現起來卻處處碰壁。其實要想實現簡便的變量計算,需要用到很多特別的函數,比如mapply、eval,有的地方還需要用到正則表達式。

    但不用擔心,我已經針對幾個常用的變量計算需求編好了相應的R函數。由于具體思路比較復雜,這里不詳細展示源代碼,大家可以從我的GitHub下載這些函數的源代碼并調用(BruceFunctions.R)。

    # 或者在線調用BruceFunctions.R source("https://raw.githubusercontent.com/psychbruce/stats/master/BruceFunctions.R")

    自編函數包括:

    COUNT:統計每個被試的不同變量(題目)中某個值出現的個數SUM:簡便計算多個變量(題目)的總分MEAN:簡便計算多個變量(題目)的平均分STD:簡便計算多個變量(題目)的標準差CONSEC:統計多個變量(題目)中連續相同數字出現最多的個數……

    主要的參數包括:

    data:原數據var & item:需計算的變量及其序號(同時定義),例如var="RSES", item=1:10;如果變量的原始順序是亂序,則變量會以1-10的順序重新排列;此為推薦用法,可省略參數名vars:直接規定使用哪些變量,例如vars=c("x1", "x2");不可省略該參數名varrange:原數據中某段范圍的變量(原始順序),例如varrange="x1:x5";不可省略該參數名
    (以上三種變量界定方式只需選擇其中一種即可,當然函數在實際運行時會把不同情況統一轉換為vars)rev:反向計分題有哪些,可以是單個數字(與item參數的順序對應),可以是具體的變量名,也可以是數字/變量名組成的向量likert:如果有反向計分題,則需要同時定義Likert是幾點量表,可以是c(1, 7)的形式,也可以是1:7的形式na.rm:是否跳過缺失值,默認為TRUE(適用大多數情況),一般不用再做設置

    下面是具體用法:

    d[,":="(n_na=COUNT(d, "x", 1:5, value=NA), # 統計x1-x5中缺失值的個數n_2=COUNT(d, "x", 1:5, value=2), # 統計2的個數sum=SUM(d, "x", 1:5), # 計算x1-x5的總分(缺失值跳過)mean1=MEAN(d, "x", 1:5), # 計算x1-x5的平均分(缺失值跳過)mean2=MEAN(d, vars=c("x1", "x4")), # 只計算x1和x4的平均分mean3=MEAN(d, varrange=c("x1", "x2")), # 計算從x1到x2的平均分(實際有4個變量)mean4=MEAN(d, varrange="x1:x2", rev="x2", likert=1:5), # 同上,但規定x2為反向計分題sd=STD(d, "x", 1:5, rev=c(2, 5), likert=1:5), # 計算x1-x5的標準差,規定x2和x5為反向計分題cons1=CONSEC(d, "x", 1:5), # 統計x1-x5連續相同數字出現最多的個數(變量按照1-5重新排列)cons2=CONSEC(d, varrange="x1:x5"))] # 同上,但以變量原始順序排列# x1 x4 x3 x2 x5 n_na n_2 sum mean1 mean2 mean3 mean4 sd cons1 cons2 # 1: 1 2 3 4 5 0 1 15 3.000000 1.5 2.5 2.000000 0.836660 0 0 # 2: 2 2 2 4 4 0 3 14 2.800000 2.0 2.5 2.000000 0.000000 2 3 # 3: 3 5 NA NA 3 2 0 11 3.666667 4.0 4.0 4.000000 1.154701 0 0 # 4: 4 4 NA 4 4 1 0 16 4.000000 4.0 4.0 3.333333 1.154701 2 2 # 5: 5 5 5 5 5 0 0 25 5.000000 5.0 5.0 4.000000 2.190890 5 4

    另外,還有兩個函數是在已有包的基礎上進行的簡單擴展(所謂“站在巨人的肩膀上”):

    RECODE:變量轉換/重新賦值,功能同SPSS的RECODE;該函數是直接調用了car包的recode函數# RECODE用法示例 data[, BirthGroup:=RECODE(BirthYear, "lo:1989=1; 1990:1999=2; 2000:2009=3; 2010:hi=4; else=NA")]Alpha:更方便地計算內部一致性信度,不需要對反向計分題額外生成新變量;該函數是調用了jmv包的reliability函數(jmv其實是jamovi軟件的程序包),并做了必要的參數設置和參數擴展
    (輸出結果為三線表,指標包括5個——量表平均分、量表標準差、量表α系數、校正后的題總相關 [即item-rest correlation]、該題如果刪除后的量表α系數,以及會智能輸出一些Note)

    最后仍然以RSES自尊量表為例,演示上述函數的用法:

    # 計算平均分(數據“原地更新”) data[, ":="(RSES=MEAN(data, "RSES", 1:10, rev=c(3, 5, 8, 9, 10), likert=1:4))]# 計算Cronbach's α系數 Alpha(data, "RSES", 1:10, rev=c(3, 5, 8, 9, 10))

    Alpha函數輸出結果樣例(基于jamovi的jmv包)

    結語

    面對“多變量計算”問題,雖然Excel和SPSS也能解決,但局限較多、過程繁瑣。而基于data.table和自編函數,我們既可以很方便地用少量代碼計算量表總分、量表平均分,也能在不生成新變量的情況下直接進行反向計分的處理和量表信度的計算,而且基本上所有的單個功能都只需要短短一行代碼就能搞定。大道至簡。

    再啰(ān)嗦(lì)幾句

    • 用R千萬別用R本身(我一般只用R本身當計算器),RStudio才是寫代碼必需的IDE(IDE = 集成開發環境)
    • jamovi作為一款基于R的新興統計軟件,具有比SPSS更簡潔美觀的界面設計,同時又擁有更強大豐富的統計功能,未來幾年應該會大范圍取代SPSS,和R一起占領統計市場(jamovi的一個新出的module甚至已經能做多重中介和有調節的中介了)
    • 簡單數據用jamovi、復雜數據用R——可以說是一種新的標配
    • 到底有多好,誰用誰知道!

    總結

    以上是生活随笔為你收集整理的r语言清除变量_如何优雅地计算多变量 | R语言进阶的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。