楼主: 0layer0
3109 6

[问答] R 寻找每一列的最小值 [推广有奖]

  • 0关注
  • 0粉丝

小学生

21%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
53 点
帖子
2
精华
0
在线时间
8 小时
注册时间
2020-12-14
最后登录
2021-2-18

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
da<-as.data.frame(matrix(c(1:20),nrow=4,ncol=5))
rownames(da)<-c('A','G','C','T')
colnames(da)<-c('a','b','c','d','e')
da[1,4]<-1
result<-t(sapply(seq(nrow(da)),function(i){
  j<-which(da[i,]== min(da[i,]), arr.ind = TRUE)
  for (k in 1:dim(j)[1])
  {c(paste(rownames(da)[i],colnames(da)[j[k,2]],sep='\t'),da[i,j[k,2]])
  }
  }))
求助各位大佬,,,想寻找dataframe中每一列的最小值,并返回其坐标信息。在for 循环里面打印输出结果是正确的,但是result中是一个空的matrix。这是怎么回事?求各位大佬解答一下

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:最小值

沙发
Nicolle 学生认证  发表于 2020-12-15 01:51:02 |只看作者 |坛友微信交流群
提示: 作者被禁止或删除 内容自动屏蔽

使用道具

藤椅
林随机漫步 发表于 2020-12-15 08:10:52 |只看作者 |坛友微信交流群
https://bbs.pinggu.org/thread-6408039-1-1.html
增加辅助列的方法挺好的(可以解决某列存在多个最小值的情况)

library(dplyr)
data=data.frame(v1=c(4,4,7,8))
data$ind=rownames(data)
# find 6,7 return row 2,3
data%>%filter(v1 %in% c(4))%>%select(ind)

使用道具

板凳
0layer0 发表于 2020-12-16 16:11:27 |只看作者 |坛友微信交流群
林随机漫步 发表于 2020-12-15 08:10
https://bbs.pinggu.org/thread-6408039-1-1.html
增加辅助列的方法挺好的(可以解决某列存在多个最小值的 ...
但是我还是想请问您一下,,就是我写的那程序,为什么最后的result是一个空的matrix。但是如果在for循环中print出结果,结果是正确的,就是不能赋值到result中。没有想明白

使用道具

报纸
林随机漫步 发表于 2020-12-16 20:59:28 |只看作者 |坛友微信交流群
0layer0 发表于 2020-12-16 16:11
但是我还是想请问您一下,,就是我写的那程序,为什么最后的result是一个空的matrix。但是如果在for循环中 ...
在判断是最小值时,需要将相应的最小值赋值给另外一个变量/矩阵,以便临时存储最小值。如果存在多个最小值我就不清楚了

使用道具

地板
JGyangzhi 发表于 2022-8-26 11:14:46 |只看作者 |坛友微信交流群
  1. #@1. 数据
  2. da<-as.data.frame(matrix(c(1:20),nrow=4,ncol=5,byrow=FALSE))
  3. rownames(da)<-c('A','G','C','T')
  4. colnames(da)<-c('a','b','c','d','e')
  5. str(da)
  6. View(da)

  7. #@2. 分析
  8. #@2.1 调用包 tidyverse
  9. library(tidyverse)
  10. #@2.2 各列中,同一行的最小值
  11. da$min_abcde <- with(da, pmin(a, b, c, d, e))
  12. str(da)
  13. View(da)
  14. #@2.3 各列中,最小值所在的行号
  15. #@ 去掉数据框 da 最后的一列 min_abcde
  16. da_part <- subset(da, select=c(a, b, c, d, e))
  17. #@ 函数,用作求一个数值向量中最小值的序号。
  18. min_row_value_id <- function(x){
  19.   min_row_value_id <- which(x==min(x))
  20.   return(min_row_value_id)
  21. }
  22. #@ mutate() 函数,调用 across() 函数, across() 函数再调用 min_row_value_id,求 a, b, c, d, e 各列的最小值所在的序号。
  23. #@ 各列值所在的序号,即各列值所在的数据框 da 的行号。
  24. da_min_row_value_id <- da_part %>%
  25.   mutate(across(c(a, b, c, d, e), min_row_value_id))
  26. #@ 重命列名
  27. colnames(da_min_row_value_id) <- c('min_a_row_id', 'min_b_row_id', 'min_c_row_id', 'min_d_row_id', 'min_e_row_id')
  28. #@ 因为同一列的各行的值都是一样,只要数据框第一行。
  29. da_min_row_value_id <- da_min_row_value_id[1,]
  30. str(da_min_row_value_id)
  31. View(da_min_row_value_id)
  32. View(da)
复制代码

使用道具

7
abelus 发表于 2022-9-13 08:55:49 |只看作者 |坛友微信交流群
sapply(da, function(x) c(min(x), which.min(x))
apply(da, 2, function(x) c(min(x), which.min(x))

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-11-6 11:08