美文网首页
R常用函数

R常用函数

作者: 毛线东东a | 来源:发表于2021-02-23 22:00 被阅读0次

    只是自己学习时的一些笔记

    R语言常用代码整理

    commannd+shift+c #批量多行注释的快捷键

    排序 order()函数
    > b<-b[order(b$sub),] #将b数据框按照列名为sub的这一列升序排列,并重新赋值给b
    #将数据框data按照性别排列,每种性别下再按照年龄升序排列。
    > data1<-data[order(data$性别,data$年龄),] 
    > data2<-data[order(data$性别),] # 按照性别升序排列
    > data3<-data[order(data$性别,-data$年龄),] #性别升序,性别内年龄降序排列。
    
    均值

    mean(b$number)计算b数据框number这一列的平均值
    rowMeans(c)计算每行的平均值
    colMeans(c)计算每列的平均值

    mean_se计算得到平均值,平均值+标准误,平均值-标准误

    high_ingroup<-mean_se(b[b$power==1 & b$group==1,"number"])

    读取b中 power一列等于1,并且 group一列等于1,所在的行,对应的number一列的数据。

    b1<-b[b$power==1 & b$group==1,"number"]

    读取b中 power一列等于1,并且 group一列等于2,所在的行,对应的number一列的数据。

    b2<-b[b$power==1 & b$group==2,"number"]

    计算b2的每一个唯一值对应的 b1数据的平均值。
    比如b2的唯一值总共有4个(0,1,2,3)。看以下b1都有哪些行 b2等于0,计算这些行b1的平均值。b2等于1,2,3同上。

    c<-tapply(b1,b2,mean)

    用apply()函数求平均值
    > x<-matrix(data=c(1,2,3,4,5,6,7,8,9,10,11,12),nrow=3)
    > x
         [,1] [,2] [,3] [,4]
    [1,]    1    4    7   10
    [2,]    2    5    8   11
    [3,]    3    6    9   12
    > apply(x,1,mean) #求每行的平均值
    [1] 5.5 6.5 7.5
    > apply(x,2,mean) #求每列的平均值
    [1]  2  5  8 11
    
    rbind 将矩阵 纵向 合并在一起。
    也就是,high_ingroup和high_outgroup等都有相同的列,按照 纵向的方式拼接在一起。

    rbind(high_ingroup,high_outgroup,high_unclass,low_ingroup,low_outgroup,low_unclass)

    与rbind对应的是 cbind,将矩阵横向合并在一起
    library(dplyr) # 载入包dplyr,方便下一步用 此包里的rename函数给数据框的列重新命名
    将y重命名为mean_number;将ymin重命名为min_number;将ymax重命名为max_number

    df1<-rename(df1, mean_number=y, min_number=ymin,max_number=ymax)

    还可以用names()函数来重命名。不需要额外载入包。
    > names(data)
     [1] "condition"           "power"               "membership"          "序号"                "实验编号"           
     [6] "性别"                "年龄"                "职业"                "权力主观评定"        "情景想象程度"       
    [11] "惩罚Q1_情景1"        "惩罚Q2_情景1"        "惩量Q3_情景1"        "惩罚Q4_情景1"        "惩罚Q5_情景1"       
    [16] "惩罚Q6_情景1"        "惩罚平均得分_情景1"  "惩罚平均得分2_情景1" "惩罚平均得分3_情景1" "惩罚Q1_情景2"       
    [21] "惩罚Q2_情景2"        "惩量Q3_情景2"        "惩罚Q4_情景2"        "惩罚Q5_情景2"        "惩罚Q6_情景2"       
    [26] "惩罚平均得分_情景2"  "报复性惩罚Q1"        "报复性惩罚Q2"        "报复性惩罚"          "期待满足性惩罚"     
    [31] "威慑动机Q1"          "威慑动机Q2"          "威慑动机Q3"          "威慑动机"            "剥夺动机"           
    [36] "改善违规者未来行为"  "mean_puni_s1"        "cat"                
    > names(data)[5]<-"subID" # 将实验编号 重命名为 subID
    
    > mydata<-data.frame(a=matrix(data=c(1,2,3,4,5,6,7,8,9,0),nrow=5,ncol=2))
    > mydata
      a.1 a.2
    1   1   6
    2   2   7
    3   3   8
    4   4   9
    5   5   0
    > mydata1<-data.frame(a=matrix(data=c(1,2,3,4,5,6,7,8,9,0,3,2),nrow=4,ncol=3))
    > mydata1
      a.1 a.2 a.3
    1   1   5   9
    2   2   6   0
    3   3   7   3
    4   4   8   2
    # 要合并mydata和mydata1,但是两个数据,变量个数不同,所以要给mydata添加一列。
    > mydata2<-transform(mydata, a.4=NA) 
    > mydata2
      a.1 a.2 a.4
    1   1   6  NA
    2   2   7  NA
    3   3   8  NA
    4   4   9  NA
    5   5   0  NA
    # 由于添加的变量名称a.4和mydata1里的a.3不同,所以合并时报错
    > mydata_new=rbind(mydata1,mydata2)
    Error in match.names(clabs, names(xi)) : 
      names do not match previous names
    > names(mydata2)
    [1] "a.1" "a.2" "a.4"
    # 重命名a.4为a.3
    > names(mydata2)[3]<-"a.3"
    > names(mydata2)
    [1] "a.1" "a.2" "a.3"
    # 合并两个数据集
    > mydata_new=rbind(mydata1,mydata2)
    > mydata_new
      a.1 a.2 a.3
    1   1   5   9
    2   2   6   0
    3   3   7   3
    4   4   8   2
    5   1   6  NA
    6   2   7  NA
    7   3   8  NA
    8   4   9  NA
    9   5   0  NA
    
    position=position_jitterdodge() 实现数据并列抖动功能。当数据大都是同一个值时,会重叠在一起,可以用这个功能。
    用法:

    position_jitterdodge(jitter.width = NULL, jitter.height = 0, dodge.width = 0.75, seed = NA)

    用于箱线图或条形图和点图在一起的情形,且有顺序的,必须箱子或条形在前,点图在后,抖动只能用在散点几何对象中,
    jitter.width 默认40%, jitter.height 默认0, dodge.width = 0.75 点分布于各组箱子(或条形)75%宽度上,默认点水平抖动错开
    也可以考虑使用 position="jitter",等价于position=position_jitter() 这个是扰动,默认抖动50%。
    可以自己自定义扰动的参数:

    geom_point(position = position_jitter(width = 0.1, height = 0.1))

    意思是:增加水平抖动10%,垂直抖动10%,但是抖动是随机的,每次结果都可能不一样。

    position=position_jitterdodge()
    position="jitterdodge"

    纵向横向同时分割

    p + facet_grid(drv ~ cyl)

    当只想单独指定行分面或列分面时,没有指定分面变量的参数需要用'.'代替
    纵向分割

    p + facet_grid(drv ~ .)

    横向分割

    p + facet_grid(. ~ cyl)

    数据类型转换

    as.numeric(a)将a转化为num类型的数据

    类型转换函数

    a[,-1]去掉数据a第一列的数据
    mydata <- transform(mydata, sumx = x1 + x2, meanx = (x1 + x2)/2)将计算mydata中,x1和x2两列的和和平均值,并添加到数据框mydata中。

    算数运算符
    逻辑运算符
    # 将data数据框情景想象程度一列,数值大于6的数据 记为 higher,
    # 并新增一列cat,将数据存储在cat一列。
    data$cat[data$情景想象程度>6]<-"higher"
    View(data)
    data$cat[data$情景想象程度<4]<-"higher"
    data$cat[data$情景想象程度<4]<-"middle"
    data$cat[data$情景想象程度>=4&data$情景想象程度<=6]<-"lower"
    
    #等价于下面的代码
    data2<-within(data2,{
    +     cat<-NA
    +     cat[情景想象程度>6] <-"higher"
    +     cat[情景想象程度<4] <-"lower"
    +     cat[情景想象程度>=4&情景想象程度<=6] <-"middle"
    + })
    View(data2)
    

    rm(data5,data6,data7,a,b,data3) #rm()删除特定变量,如果有多个变量,用逗号分隔

    缺失值识别

    在R中,缺失值以符号NA(not available)表示
    函数is.na()可以用来检测缺失值是否存在。它会返回一个与数据大小相同的逻辑对象,如果某个元素是缺失值,就返回TURE,否则就返回FALSE。
    无限的值(正无穷和负无穷)分别用Inf和-Inf来表示。用is.infinite()来检测。
    不可能出现的值用NaN(not a number)来表示。用is.nan()来检测。
    要注意NA NaN Inf三者的区别。

    > a<-is.na(data[,5:7])
           subID  性别  年龄
      [1,]  TRUE FALSE FALSE
      [2,]  TRUE FALSE FALSE
      [3,]  TRUE FALSE FALSE
      [4,]  TRUE FALSE FALSE
      [5,]  TRUE FALSE FALSE
      [6,]  TRUE FALSE FALSE
    > str(a)
     logi [1:174, 1:3] TRUE TRUE TRUE TRUE TRUE TRUE ...
     - attr(*, "dimnames")=List of 2
      ..$ : NULL
      ..$ : chr [1:3] "subID" "性别" "年龄"
    > dim(a)
    [1] 174   3
    > class(a)
    [1] "matrix" "array" 
    > mode(a)
    [1] "logical"
    
    统计分析时,不考虑缺失值NA。

    可以使用na.rm=TRUE不把缺失值纳入统计。
    可以使用na.omit()删除所有含缺失值数据的行。

    > sum(data$subID) #因为subID一列包含缺失值,所以返回值是NA
    [1] NA
    > sum(data$subID, na.rm=TRUE)#na.rm=TRUE不把缺失值纳入统计
    [1] 5108
    > data_new<-na.omit(data) #删除data中含有缺失值NA数据的行。
    > data
       condition power membership 序号 subID 性别 年龄 职业 权力主观评定 情景想象程度 惩罚Q1_情景1 惩罚Q2_情景1 惩量Q3_情景1
    1         11     1          1    1    NA    2   19    1            5            5            7            7            6
    2         11     1          1    2    NA    2   18    1            7            7            7            7            7
    3         11     1          1    3    NA    2   20    1            7            6            6            6            6
    4         11     1          1    4    NA    2   18    1            7            5            6            6            6
    5         11     1          1    6    NA    2   18    1            7            7            7            7            7
    > data_new
        condition power membership 序号 subID 性别 年龄 职业 权力主观评定 情景想象程度 惩罚Q1_情景1 惩罚Q2_情景1 惩量Q3_情景1
    34         11     1          1    1   101    2   22    1            7            4            7            7            7
    35         11     1          1    2   103    2   22    1            7            5            6            6            6
    36         11     1          1    3   107    1   26    1            7            4            6            6            6
    37         11     1          1    4   109    2   23    1            6            6            6            6            6
    72         12     1          2    1   999    2   26    1            7            7            7            7            7
    
    
    显示时间和日期
    > date() #显示当前的时间和日期
    [1] "Thu Feb 25 11:58:27 2021"
    > Sys.Date() #显示当前的日期
    [1] "2021-02-25"
    

    citation() # 输出R的引用 参考文献
    citation(“lme4”) #输出lme4这个包的引用 参考文献

    批量更改数据类型为factor
    image.png
    提取特定行/列的数据

    leadership[ , c(6:10)] #这里代表leadership的所有行,6到10列的数据。
    需要注意的是,在R里面,用留空代表所有行,这个是跟matlab不一样的地方。
    另一种方法是:

    > a<-c(1:8)
    > b<-c(3:10)
    > c<-paste("c",1:8,sep="")
    > e<-data.frame(a,b,c)
    > e
      a  b  c
    1 1  3 c1
    2 2  4 c2
    3 3  5 c3
    4 4  6 c4
    5 5  7 c5
    6 6  8 c6
    7 7  9 c7
    8 8 10 c8
    # 使用subset()函数,提取a列大于3同时b列小于8的行,c列的数据
    > f<-subset(e,e$a>3 & e$b<8,select=c)
    > f
       c
    4 c4
    5 c5
    
    删除特定列的数据
    # %in%含义是:
    # 看names(leadership)的元素是否包含在c("q3", "q4”)中,返回逻辑值TRUE 或者 FALSE
    myvars <- names(leadership) %in% c("q3", "q4") 
    newdata <- leadership[!myvars]
    # 上述代码的含义是:首先leadership中变量名为q3和q4的列会返回TRUE,
    # 下一步,通过!myvars选择除了q3和q4之外的列,赋值给新的变量newdata。
    # 这样就间接达到了删除q3和q4列的目的。
    # 另一种方法
    newdata <- leadership[c(-8,-9)] #前面加负号就代表删除这一列。
    # 第三种方法
    # 将q3和q4设置为NULL,达到的目的是一样的,就是把q3和q4两列删除
    leadership$q3 <- leadership$q4 <- NULL
    
    用sample()函数随机抽取数据
    > nrow(e)
    [1] 8
    # 1:nrow(e)代表1到8,3代表从1到8中随机抽取3个数,replace=FALSE代表无放回的抽取
    # e[sample(1:nrow(e),3,replace=FALSE), ]代表选取 e中,生成的行里面所有列的数据。
    > e[sample(1:nrow(e),3,replace=FALSE), ]
      a  b  c
    6 6  8 c6
    7 7  9 c7
    8 8 10 c8
    > e[sample(1:nrow(e),3,replace=FALSE), ]
      a  b  c
    6 6  8 c6
    1 1  3 c1
    8 8 10 c8
    > e[sample(1:nrow(e),3,replace=FALSE), ]
      a b  c
    7 7 9 c7
    4 4 6 c4
    2 2 4 c2
    
    R中常用的数值和字符处理函数
    R中常用的数学函数1
    R中常用的数学函数2

    当这些函数被应用于数值向量,矩阵或者数据框时,他们会作用于每一个独立的值。例如:下面的例子,是对向量中的每一个数值都求平方。

    > a<-c(3.5,2.5,1.5,0.5,1.5,2.5,3.5)^2
    > a
    [1] 12.25  6.25  2.25  0.25  2.25  6.25 12.25
    
    统计函数
    用scale()函数进行数据的标准化
    数据的标准化
    > mydata<-read.csv(file.choose()) #手动选取文件读入数据
    > str(mydata) #查看数据结构
    'data.frame':   84 obs. of  5 variables:
     $ subject  : chr  "F1" "F1" "F1" "F1" ...
     $ gender   : chr  "F" "F" "F" "F" ...
     $ scenario : int  1 1 2 2 3 3 4 4 5 5 ...
     $ attitude : chr  "pol" "inf" "pol" "inf" ...
     $ frequency: num  213 204 285 260 204 ...
    > head(mydata) #查看数据前6列
      subject gender scenario attitude frequency
    1      F1      F        1      pol     213.3
    2      F1      F        1      inf     204.5
    3      F1      F        2      pol     285.1
    4      F1      F        2      inf     259.7
    5      F1      F        3      pol     203.9
    6      F1      F        3      inf     286.9
    # 提取scenario和frequency两列的的数据,赋值给mydata1
    > mydata1<-mydata[,names(mydata) %in% c("scenario","frequency")]
    > head(mydata1) #查看mydata1的前6列
      scenario frequency
    1        1     213.3
    2        1     204.5
    3        2     285.1
    4        2     259.7
    5        3     203.9
    6        3     286.9
    > mydata2<-scale(mydata1) #对mydata1的所有列分别进行标准化,使其成为平均数为0,标准差为1的数据。
    > head(mydata2)
           scenario frequency
    [1,] -1.4910447 0.3008524
    [2,] -1.4910447 0.1665847
    [3,] -0.9940298 1.3963552
    [4,] -0.9940298 1.0088097
    [5,] -0.4970149 0.1574300
    [6,] -0.4970149 1.4238191
    > mean1<-mean(mydata1$scenario) #计算scenario一列的平均值
    > s1<-sd(mydata1$scenario) #计算scenario一列的标准差
    > mean1
    [1] 4
    > s1
    [1] 2.012012
    # 手动标准化 
    > standard_scenario<-(mydata1$scenario-mean1)/s1
    > standard_scenario
     [1] -1.4910447 -1.4910447 -0.9940298 -0.9940298 -0.4970149 -0.4970149  0.0000000  0.0000000  0.4970149  0.4970149
    [11]  0.9940298  0.9940298  1.4910447  1.4910447 -1.4910447 -1.4910447 -0.9940298 -0.9940298 -0.4970149 -0.4970149
    [21]  0.0000000  0.0000000  0.4970149  0.4970149  0.9940298  0.9940298  1.4910447  1.4910447 -1.4910447 -1.4910447
    [31] -0.9940298 -0.9940298 -0.4970149 -0.4970149  0.0000000  0.0000000  0.4970149  0.4970149  0.9940298  0.9940298
    [41]  1.4910447  1.4910447 -1.4910447 -1.4910447 -0.9940298 -0.9940298 -0.4970149 -0.4970149  0.0000000  0.0000000
    [51]  0.4970149  0.4970149  0.9940298  0.9940298  1.4910447  1.4910447 -1.4910447 -1.4910447 -0.9940298 -0.9940298
    [61] -0.4970149 -0.4970149  0.0000000  0.0000000  0.4970149  0.4970149  0.9940298  0.9940298  1.4910447  1.4910447
    [71] -1.4910447 -1.4910447 -0.9940298 -0.9940298 -0.4970149 -0.4970149  0.0000000  0.0000000  0.4970149  0.4970149
    [81]  0.9940298  0.9940298  1.4910447  1.4910447
    > mydata2<-cbind(mydata2,standard_scenario) #将手动标准化的结果与mydata2合并
    > head(mydata2) #查看结果,发现,scenario和standard_scenario相等。
           scenario frequency standard_scenario
    [1,] -1.4910447 0.3008524        -1.4910447
    [2,] -1.4910447 0.1665847        -1.4910447
    [3,] -0.9940298 1.3963552        -0.9940298
    [4,] -0.9940298 1.0088097        -0.9940298
    [5,] -0.4970149 0.1574300        -0.4970149
    [6,] -0.4970149 1.4238191        -0.4970149
    # 对特定列scenario进行标准差为5,平均值为20的标准化,标准化后的结果赋值给变量standard_scenario2,并加入到mydata中生成新的一列,最后赋值给mydata3
    > mydata3<-transform(mydata,standard_scenario2=scale(scenario)*5+20)
    > head(mydata3)
      subject gender scenario attitude frequency standard_scenario2
    1      F1      F        1      pol     213.3           12.54478
    2      F1      F        1      inf     204.5           12.54478
    3      F1      F        2      pol     285.1           15.02985
    4      F1      F        2      inf     259.7           15.02985
    5      F1      F        3      pol     203.9           17.51493
    6      F1      F        3      inf     286.9           17.51493
    > mean(mydata3$standard_scenario2) #计算平均值,发现确实是20
    [1] 20
    > sd(mydata3$standard_scenario2)#计算标准差,发现确实是5
    [1] 5
    
    概率函数
    概率分布

    set.sed()指定种子,可以让结果重现。set.seed()括号里面的参数可以是任意数字,是代表你设置的第几号种子而已,不会参与运算,是个标记而已。

    #将ToothGrowth_new数据框中的supp列,等于OJ的数据替换为WJ
    #因为supp是factor,所以要先变成character 不然会报错
    > ToothGrowth_new$supp<-as.character(ToothGrowth_new$supp)
    > ToothGrowth_new$supp[which(ToothGrowth_new$supp=="OJ")] <-"WJ"
    #通过aggregate函数,计算ToothGrowth$supp这一列,不同因子水平上 len这一列的平均值。
    > aggregate(ToothGrowth$len,by=list(ToothGrowth$supp),FUN=mean)
      Group.1      x
    1      OJ 20.663
    2      VC 16.963
    
    #通过str()函数 或者as.numeric()函数可以查看 不同标签对应的数字是多少
    as.numeric(ToothGrowth$supp,lable=c("OJ","VC"))
    
    百分号的写法
    > a<-percent(c(0,1))
    > a
    [1] "0%"   "100%"
    > str(a)
     chr [1:2] "0%" "100%"
    
    查看转义字符的使用方法

    ?Quotes

    用sapply()函数提取列表的某一行的某一列
    # "[" 是一个可以提取某个对象的一部分的函数。在这里是用来提取列表y个成分中的第一个和第二个元素的。
    > sapply(y,"[",2) #提取y中的每一行的第二列的数据
     [1] "Davis"      "Williams"   "Moose"      "Jones"     
     [5] "Markhammer" "Cushing"    "Ytzrhak"    "Knox"      
     [9] "England"    "Rayburn"   
    > sapply(y,"[",1) #提取y中的每一行的第一列的数据
     [1] "John"       "Angela"     "Bullwinkle" "David"     
     [5] "Janice"     "Cheryl"     "Reuven"     "Greg"      
     [9] "Joel"       "Mary"   
    
    使用strsplit()函数将元素拆分 应用到字符串组成的向量上会返回一个列表
    # 这里是用空格符号将Student数据里的 姓氏和姓名分开
    > y <- strsplit(roster$Student, " ")
    > y
    [[1]]
    [1] "John"  "Davis"
    
    [[2]]
    [1] "Angela"   "Williams"
    
    [[3]]
    [1] "Bullwinkle" "Moose"     
    
    [[4]]
    [1] "David" "Jones"
    
    [[5]]
    [1] "Janice"     "Markhammer"
    
    [[6]]
    [1] "Cheryl"  "Cushing"
    
    [[7]]
    [1] "Reuven"  "Ytzrhak"
    
    [[8]]
    [1] "Greg" "Knox"
    
    [[9]]
    [1] "Joel"    "England"
    
    [[10]]
    [1] "Mary"    "Rayburn"
    
    quantile()函数计算百分位
    # 这里是计算score 的0.8 0.6 0.4和0.2百分位。
    > y <- quantile(roster$score, c(.8,.6,.4,.2))
    > y 
    80% 60% 40% 20%
    0.74 0.44 -0.36 -0.89
    
    apply() lapply() sapply()

    apply() 可以把函数应用到数组的某个维度上;
    lapply() sapply()可以把函数应用到列表上。

    image.png
    image.png
    cut()可以把连续变量x分割为有着n个水平的因子
    > age1<-cut(bc$age,breaks = 3,labels = c(1,2,3))#平均分为3个区间,命名为1,2,3
    > age2<-cut(bc$age,breaks=c(0,20,60,100),include.lowest=T,
    labels = c(1,2,3))
    #把age划分为0-20,20-60,60到100这样3个区间
    > dd<-cbind(bc,age2) #把变量加入表格
    > x<-cut(c(1,2,3,4,5,6,7,8,9), 3,labels=c(1,2,3))
    > x
    [1] 1 1 1 2 2 2 3 3 3
    Levels: 1 2 3
    
    循环 和 条件执行
    for循环

    for循环 重复执行一个语句,直到某个变量的值不再包含在序列seq中为止。
    for (var in seq) statement

    for (i in 1:10)
    {
    print("Hello")
    }
    
    while循环

    while循环重复地执行一个语句,直到条件不为真为止。
    while (cond) statement

    i <- 10 
    while (i > 0) 
    {
    print("Hello"); 
    i <- i - 1
    }
    
    if-else

    if (cond) statement if 在某个给定条件为真时执行语句。
    if (cond) statement1 else statement2 if-else 在某个给定条件为真时执行语句,为假时执行另外的语句。

    if (is.character(grade)) 
    grade <- as.factor(grade) 
    
    if (!is.factor(grade)) 
    grade <- as.factor(grade) 
    else 
    print("Grade already is a factor")
    
    ifelse

    ifelse(cond, statement1, statement2)
    若cond为TRUE,则执行第一个语句statement1;若cond为FALSE,则执行第二个语句statement2。

    ifelse(score > 0.5, print("Passed"), print("Failed")) 
    outcome <- ifelse (score > 0.5, "Passed", "Failed")
    
    switch

    switch(expr, ...) switch根据一个表达式的值选择语句执行。

    feelings <- c("sad", "afraid")
    for (i in feelings) 
    print( 
    switch(i, 
    happy = "I am glad you are happy", 
    afraid = "There is nothing to fear", 
    sad = “cheer up”,
    angry = "Calm down now" ) 
    # 含义是,i等于sad时,print(也就是输出)cheer up
    # i等于afraid时,print(也就是输出)There is nothing to fear
    )
    
    用户自编函数
    image.png
    转置 t()

    函数t()对一个矩阵或者数据框进行转置

    数据重构这部分 待补充

    相关文章

      网友评论

          本文标题:R常用函数

          本文链接:https://www.haomeiwen.com/subject/fxmdfltx.html