R语言中如何筛选三个不同数据框/向量中长度最长的对象并赋值?
找到R中长度最长的对象的方法
嘿,这个需求其实很好解决!R里虽然没有专门直接返回最长对象的内置函数,但我们用基础函数组合就能轻松实现,甚至可以封装一个小函数方便复用。
基础实现步骤
首先,我们把要比较的对象放到一个列表里(列表能轻松容纳不同长度的元素),然后借助lengths()和which.max()来定位最长的那个:
先定义你的变量:
x <- c(1:10) y <- c(1:20) z <- c(1:40)
把它们打包成列表:
obj_list <- list(x = x, y = y, z = z)
提取最长的对象:
longest_obj <- obj_list[[which.max(lengths(obj_list))]]
简单解释下:
lengths(obj_list)会返回列表中每个元素的长度,这里得到的是c(10, 20, 40)which.max()会找到最大数值对应的索引位置,这里是3- 最后用
[[ ]]从列表中取出对应位置的对象,也就是z
封装成可复用的函数
如果以后经常需要做这个操作,不如封装一个小函数,这样传任意数量的对象都能直接用:
get_longest <- function(...) { # 把传入的所有对象打包成列表 obj_list <- list(...) # 定位并返回最长的对象 obj_list[[which.max(lengths(obj_list))]] }
调用起来超简单:
longest_obj <- get_longest(x, y, z)
额外说明
如果存在多个长度相同且都是最长的对象,which.max()只会返回第一个出现的那个。如果需要返回所有最长的对象,可以稍微修改函数:
get_all_longest <- function(...) { obj_list <- list(...) len <- lengths(obj_list) max_len <- max(len) obj_list[len == max_len] }
这个版本会返回一个包含所有最长对象的列表,按需取用就行。
内容的提问来源于stack exchange,提问作者Jake
相关产品推荐
相关产品推荐

