- 知道各行各业都有鄙视链,没想到函数之间都有,真是相煎何太急。。。
- 我都要渴死了,你跟我讲农夫山泉和依云的区别,等我先活过去再说吧。。。
这两天我活过来了,静下心来了解下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)
网友评论