如何在R语言中比较行内单元格与该行均值并统计符合条件的数量
补充后的完整R代码
方法一:基于apply逐行处理
和原代码逻辑延续性更强,用apply逐行完成比较与求和:
a<-c(1, 94, 19, 62, 20, 74, 20, 35, 52, 78) b<-c(22, 7, 70, 25, 57, 100, 25, 45, 26, 34) c<-c(28, 97,69, 76, 4, 72, 25, 8, 35, 72) d<-c(19, 18, 7, 26, 59, 88, 33, 100, 44, 59) data<-data.frame(a, b, c, d) data$mean <- apply(data, 1, mean) # 补充部分:逐行比较元素与该行均值,大于记1后求和 data$comparison <- apply(data[, c("a", "b", "c", "d")], 1, function(x) sum(x > data$mean[which(row(data) == row(x))]))
方法二:矢量化操作(更高效简洁)
用R内置矢量化函数替代循环类操作,代码更简洁且运行效率更高:
a<-c(1, 94, 19, 62, 20, 74, 20, 35, 52, 78) b<-c(22, 7, 70, 25, 57, 100, 25, 45, 26, 34) c<-c(28, 97,69, 76, 4, 72, 25, 8, 35, 72) d<-c(19, 18, 7, 26, 59, 88, 33, 100, 44, 59) data<-data.frame(a, b, c, d) data$mean <- rowMeans(data) # 用rowMeans替代apply计算行均值,效率更高 # 矢量化比较:每行元素与对应均值比较生成布尔矩阵,转整数后按行求和 data$comparison <- rowSums(data[, 1:4] > data$mean)
代码说明
rowMeans(data):专门计算数据框行均值的函数,比apply(data,1,mean)更高效data[,1:4] > data$mean:利用R的广播特性,将每行4个元素与该行均值逐一比较,生成TRUE/FALSE矩阵(R中TRUE等价于1,FALSE等价于0)rowSums():直接对每行的0-1值求和,得到每行大于均值的元素个数
内容的提问来源于stack exchange,提问作者dbfk2000
相关产品推荐
相关产品推荐

