R语言如何对dataframe中存储向量的列逐行取最大值
问题处理方案
构造数据失败原因
你之前写的构造代码没有生成预期的嵌套单元格结构,是因为直接用c()拼接多个向量时,R会自动把所有元素打平成一个长向量,不会按行保留独立的子向量,要实现每行单元格存独立向量的列表列结构,需要用list()包装每个单元格的内容。
正确构造示例数据的代码
library(tibble) df <- tibble( ID = c("A1", "A2", "A3"), Name = list(c("Rob","Rob"), c("Emil","Emil","Emil"), c("Nick","Nick","Nick")), R1 = list(27, c("1000","26"), c("123","26")), R2 = list(29, c("70","26"), c("567","80")), R3 = list(100, c("100","80"), c("93","80")) )
逐单元格提取最大值实现方法
你已经实现了Name列的去重逻辑,注意你当前用lapply()处理后的Name列还是列表格式,我们可以和数值列的处理一起完成,最终转成普通的扁平数据框。
方法1:Base R 实现(无需额外安装包)
# 处理Name列:去重后取唯一值,转为普通字符向量 df$Name <- sapply(df$Name, function(x) unique(x)[1]) # 指定需要计算最大值的数值列 num_cols <- c("R1", "R2", "R3") # 逐列逐单元格转数值后取最大值 df[num_cols] <- lapply(df[num_cols], function(col) { sapply(col, function(cell_val) max(as.numeric(cell_val))) })
方法2:Tidyverse 实现(适配tibble使用习惯)
如果你日常用tidyverse生态的函数,用跨列处理语法写起来更简洁:
library(dplyr) library(purrr) df <- df %>% mutate( Name = map_chr(Name, ~unique(.x)[1]), across(starts_with("R"), ~map_dbl(.x, ~max(as.numeric(.x)))) )
注意事项
- 原始数据中多值单元格存储的是字符类型的数值,取最大值前必须先转成数值类型,否则会按字符串排序规则计算,得到错误结果(比如字符串排序下"93"大于"567")
- 处理完的结果和你预期的结构完全一致:
# A tibble: 3 × 5 ID Name R1 R2 R3 <chr> <chr> <dbl> <dbl> <dbl> 1 A1 Rob 27 29 100 2 A2 Emil 1000 70 100 3 A3 Nick 123 567 93
内容的提问来源于stack exchange,提问作者minoo
相关产品推荐
相关产品推荐

