美文网首页R语言
入R随俗-apply和for

入R随俗-apply和for

作者: Juan_NF | 来源:发表于2019-05-10 09:20 被阅读68次
    • 知道各行各业都有鄙视链,没想到函数之间都有,真是相煎何太急。。。
    • 我都要渴死了,你跟我讲农夫山泉和依云的区别,等我先活过去再说吧。。。
    • 这两天我活过来了,静下心来了解下apply;
    • 其实归根结底还是function用得好,才能得到想要的结果,否则,我们也就只能用R里已有的函数进行行列循环而已;
    下面,我们用apply和for同时实现相同的需求:
    test数据框:
    • 先构建一个数据框,含数值和字符:
    apply(X, MARGIN, FUN, ...)
    > rm(list=ls())
    > test<-data.frame(a=seq(1,10,2),b=seq(2,11,2),c=seq(11,20,2),d=c('mon','tue','wed','thu','fri'))
    > test
      a  b  c   d
    1 1  2 11 mon
    2 3  4 13 tue
    3 5  6 15 wed
    4 7  8 17 thu
    5 9 10 19 fri
    
    用function和apply实现:

    之前有讲过function的结构和简单使用:https://www.jianshu.com/p/ea29d93836df
    之前有讲过paste0:https://www.jianshu.com/p/2ee3a2625be3

    • 对第一和第三个元素求均值
    • 将第2和第4个元素连接在一起
    • 以行为单位进行运算
    > y<-function(x){
    +   mean_row<-mean(as.numeric(c(x[1],x[3])))
    +   str_paste<-paste0(x[2],x[4])
    +   result<-c(mean=mean_row,str=str_paste)
    +   return(result)
    +   }
    > tmp<-apply(test,1,y)
    > tmp
         [,1]    [,2]    [,3]    [,4]    [,5]   
    mean "6"     "8"     "10"    "12"    "14"   
    str  " 2mon" " 4tue" " 6wed" " 8thu" "10fri"
    > class(test)
    [1] "data.frame"
    > class(tmp)
    [1] "matrix"
    
    用for循环实现:
    • 先构建合适dim的数据框或其他数据对象(这里构建了5行两列)
    • 构建for循环,循环的范围(从第一行到最后一行)和循环的内容(mean和paste0)
    • 不同的结果放在不同的列,最终得到承载结果的数据对象(test_r)
    > test_r<-c(rep(1,10))
    > dim(test_r)<-c(5,2)
    > for(i in 1:nrow(test)){
    +   test_r[i,1]<-mean(c(test[i,1],test[i,3]))
    +   test_r[i,2]<-paste0(test[i,2],test[i,4])
    + }
    > test_r
         [,1] [,2]   
    [1,] "6"  "2mon" 
    [2,] "8"  "4tue" 
    [3,] "10" "6wed" 
    [4,] "12" "8thu" 
    [5,] "14" "10fri"
    

    课程分享
    生信技能树全球公益巡讲
    https://mp.weixin.qq.com/s/E9ykuIbc-2Ja9HOY0bn_6g
    B站公益74小时生信工程师教学视频合辑
    https://mp.weixin.qq.com/s/IyFK7l_WBAiUgqQi8O7Hxw
    招学徒:
    https://mp.weixin.qq.com/s/KgbilzXnFjbKKunuw7NVfw

    相关文章

      网友评论

        本文标题:入R随俗-apply和for

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