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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

R 回归 虚拟变量na_如何优雅地计算多变量

發布時間:2025/3/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 R 回归 虚拟变量na_如何优雅地计算多变量 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作者:包寒吳霜

中科院心理所碩士在讀(名字/人格/社會/文化心理學)

知乎:https://www.zhihu.com/people/psychbruce

社會科學研究經常會遇到“超多變量”的情況——多量表、多維度、多題項,以及復雜的正反計分題……如何更高效地計算量表總分?如何更簡潔地進行反向計分?

本文將為大家分享如何使用R語言(data.table包 + 自編函數)優雅地計算多變量。

當我們的數據中存在成百上千個變量時,不僅變量管理存在一定的難度,而且變量計算也會變得比較復雜。如果使用R來處理,有哪些現存的方法呢?

  • dplyr包的mutate函數(需再次賦值給data)

1data=mutate(data,?X=x1+x2+x3,?Y=y1+y2+y3)
  • data.table包的“:=”函數(原地更新,無需賦值)

1#?單變量計算2data[,?X:=x1+x2+x3]3#?多變量同時計算4data[,?":="(X=x1+x2+x3,?Y=y1+y2+y3)]

變量少還好說,然而,一旦遇到幾十個甚至幾百個變量,我們都希望利用更簡便的方法來計算總分或平均分,而不是一個個敲變量名。

首先,直接使用sum(...)或mean(...)是行不通的,大家可以自行嘗試(算出來的其實是每一列的總分而不是每一行的總分)。實際上,我們需要用mapply把相關函數施加于各個變量上,這樣才能分別對每一行計算總分:

1data[,?":="(Xsum=mapply(sum,?x1,?x2,?x3))]

這只是一個初步的解決思路,但依然尚未解決多變量的問題——我們并不想一個個敲變量名。

于是乎,針對大家經常遇到的一些變量計算需求,我編制了相應的R函數,既可以用于普通的data.frame(mutate),也可以用于data.table(:=)。

下面以計算平均值為例,介紹自編的MEAN函數的基本用法:

1data[,?":="(Xmean1=MEAN(data,?"x",?1:50),2????????????Xmean2=MEAN(data,?vars=c("x1",?"x2",?"x3")),3????????????Xmean3=MEAN(data,?varrange="x1:x50"),4????????????Xmean4=MEAN(data,?"x",?1:50,?rev=41:50,?likert=1:7))]

MEAN的第一個參數為原來的數據(data.frame或data.table),后面的若干參數用來定義變量范圍和反向計分題:

  • 對于有規律的變量名,如x1-x50,只需要定義var="x"和item=1:50即可(此為推薦用法,并且var和item參數名可省略)

  • 或者可以通過vars具體列出參與計算的變量(字符串向量)

  • 另外還可以通過varrange="x1:x50"或varrange=c("x1","x50")的形式定義變量的起止范圍
    【提示:此時的1和50不代表數字上的連續范圍,也就是說,varrange定義的起止范圍是數據中變量的原始位置,如果原始變量的后綴數字是亂序排列的,則推薦使用var和item定義】

  • 如果涉及反向計分題,只需要通過rev參數定義哪些題目反向計分(可以是單個數字、單個字符串、數字向量、字符串向量),并通過likert參數定義題目是幾點量表(例如1-7點的量表,設置likert=1:7或者likert=c(1, 7)均可)

MEAN函數的源代碼如下(復制并運行即可使用):

1MEAN=function(data,?var=NULL,?items=NULL, 2??????????????vars=NULL, 3??????????????varrange=NULL, 4??????????????rev=NULL,?likert=NULL, 5??????????????na.rm=TRUE)?{ 6??Mean=function(...)?mean(c(...),?na.rm=na.rm) 7??if(!is.null(varrange))?{ 8????dn=names(data) 9????if(length(varrange)==1)?varrange=strsplit(varrange,?":")[[1]]10????varMin=varrange[1]11????varMax=varrange[length(varrange)]12????vars=dn[which(dn==varMin):which(dn==varMax)]13??}?else?{14????if(is.null(vars))?vars=paste0(var,?items)15??}16??if(is.character(rev))?rev=which(vars?%in%?rev)17??vars=paste(deparse(substitute(data)),?vars,?sep="$")18??pre=rep("",?length(vars))19??pre[rev]=ifelse(is.null(likert),?"",?paste0(min(likert)+max(likert),?"-"))20??varlist=paste0(pre,?vars)21??eval(parse(text=paste0("mapply(Mean,?",?paste(varlist,?collapse=",?"),?")")))22}

除了MEAN之外,還有其他的幾個自編函數,用法與MEAN類似,包括SUM(計算總分)、COUNT(統計某個值在多個變量中的出現次數)、CONSEC(統計多個變量中連續相同數字出現最多的個數):

1SUM=function(data,?var=NULL,?items=NULL, 2?????????????vars=NULL, 3?????????????varrange=NULL, 4?????????????rev=NULL,?likert=NULL, 5?????????????na.rm=TRUE)?{ 6??Sum=function(...)?sum(...,?na.rm=na.rm) 7??if(!is.null(varrange))?{ 8????dn=names(data) 9????if(length(varrange)==1)?varrange=strsplit(varrange,?":")[[1]]10????varMin=varrange[1]11????varMax=varrange[length(varrange)]12????vars=dn[which(dn==varMin):which(dn==varMax)]13??}?else?{14????if(is.null(vars))?vars=paste0(var,?items)15??}16??if(is.character(rev))?rev=which(vars?%in%?rev)17??vars=paste(deparse(substitute(data)),?vars,?sep="$")18??pre=rep("",?length(vars))19??pre[rev]=ifelse(is.null(likert),?"",?paste0(min(likert)+max(likert),?"-"))20??varlist=paste0(pre,?vars)21??eval(parse(text=paste0("mapply(Sum,?",?paste(varlist,?collapse=",?"),?")")))22}232425COUNT=function(data,?var=NULL,?items=NULL,26???????????????vars=NULL,27???????????????varrange=NULL,28???????????????value=NA)?{29??Count=function(...)?sum(c(...),?na.rm=TRUE)30??if(!is.null(varrange))?{31????dn=names(data)32????if(length(varrange)==1)?varrange=strsplit(varrange,?":")[[1]]33????varMin=varrange[1]34????varMax=varrange[length(varrange)]35????vars=dn[which(dn==varMin):which(dn==varMax)]36??}?else?{37????if(is.null(vars))?vars=paste0(var,?items)38??}39??vars=paste(deparse(substitute(data)),?vars,?sep="$")40??if(is.na(value))?{41????varlist=paste0("is.na(",?vars,?")")42??}?else?{43????varlist=paste0(vars,?"==",?value)44??}45??eval(parse(text=paste0("mapply(Count,?",?paste(varlist,?collapse=",?"),?")")))46}474849CONSEC=function(data,?var=NULL,?items=NULL,50????????????????vars=NULL,51????????????????varrange=NULL,52????????????????values=0:9)?{53??Conseq=function(string,?number=values)?{54????#?Consecutive?Identical?Digits55????require(stringr)56????pattern=paste(paste0(number,?"{2,}"),?collapse="|")57????ifelse(grepl(pattern,?string),?max(nchar(str_extract_all(string=string,?pattern=pattern,?simplify=TRUE))),?0)58??}59??if(!is.null(varrange))?{60????dn=names(data)61????if(length(varrange)==1)?varrange=strsplit(varrange,?":")[[1]]62????varMin=varrange[1]63????varMax=varrange[length(varrange)]64????vars=dn[which(dn==varMin):which(dn==varMax)]65??}?else?{66????if(is.null(vars))?vars=paste0(var,?items)67??}68??vars=paste(deparse(substitute(data)),?vars,?sep="$")69??varlist=vars70??eval(parse(text=paste0("mapply(Conseq,?paste0(",?paste(varlist,?collapse=",?"),?"))")))71}

最后,我們以一個具體的例子來綜合演示上述函數的用法。在下面的這個data.table中,我特意將x2和x4的位置對調了,大家可以自行體會不同參數之間的微妙差別(如var、vars、varrange)

1d=data.table(x1=1:5,?x4=c(2,2,5,4,5),?x3=c(3,2,NA,NA,5),?x2=c(4,4,NA,2,5),?x5=c(5,4,1,4,5)) 2#????x1?x4?x3?x2?x5 3#?1:??1??2??3??4??5 4#?2:??2??2??2??4??4 5#?3:??3??5?NA?NA??1 6#?4:??4??4?NA??2??4 7#?5:??5??5??5??5??5 8 9d[,":="(n.na=COUNT(d,?"x",?1:5,?value=NA),10????????n.2=COUNT(d,?"x",?1:5,?value=2),11????????sum=SUM(d,?"x",?1:5),12????????mean1=MEAN(d,?"x",?1:5),13????????mean2=MEAN(d,?vars=c("x1",?"x4")),14????????mean3=MEAN(d,?varrange="x1:x2",?rev="x2",?likert=1:5),15????????cons1=CONSEC(d,?"x",?1:5),16????????cons2=CONSEC(d,?varrange="x1:x5"))]17#????x1?x4?x3?x2?x5?n.na?n.2?sum?mean1?mean2?mean3?cons1?cons218#?1:??1??2??3??4??5????0???1??15???3.0???1.5?????2?????0?????019#?2:??2??2??2??4??4????0???3??14???2.8???2.0?????2?????2?????320#?3:??3??5?NA?NA??1????2???0???9???3.0???4.0?????4?????0?????021#?4:??4??4?NA??2??4????1???1??14???3.5???4.0?????4?????2?????222#?5:??5??5??5??5??5????0???0??25???5.0???5.0?????4?????5?????5

Tips:三種定義變量的方式選擇其一即可,分別適用于不同需求——

  • var和item會將變量按照item的數字順序重新排列(在函數內部其實是paste了var和item)

  • vars則以該參數實際定義的順序為準

  • varrange定義的是起止位置的變量(因此在本例中“x1:x2”實則對應了“x1, x4, x3, x2”四個變量)

?

更多實用函數,請訪問作者的GitHub:

https://github.com/psychbruce/stats/blob/master/BruceFunctions.R

公眾號后臺回復關鍵字即可學習

回復?爬蟲???????? ? ?爬蟲三大案例實戰??回復?Python? ? ? ?1小時破冰入門

回復?數據挖掘?? ? R語言入門及數據挖掘回復?人工智能?? ? 三個月入門人工智能回復?數據分析師??數據分析師成長之路?回復?機器學習????? 機器學習的商業應用回復?數據科學????? 數據科學實戰回復?常用算法????? 常用數據挖掘算法

萬水千山總是情,點個 “好看” 行不行!!!

?

總結

以上是生活随笔為你收集整理的R 回归 虚拟变量na_如何优雅地计算多变量的全部內容,希望文章能夠幫你解決所遇到的問題。

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