You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 14:06:31