基于带约束线性模型,构建含行列号及最小值的DataFrame遇阻
解决方法:提取每行最小值对应的列/行号及实际时间值
我完全懂你现在的困扰——你已经有一个包含time.1到time.5这类时间列的DataFrame,想要生成一个新的DataFrame,里面包含行编号、最小值所在的列编号,以及这个最小值的实际时间值。下面我给你分步骤拆解实现方法:
1. 先锁定目标时间列
首先得把所有time.*开头的列单独筛选出来,避免和其他列(比如你的h列)混在一起。假设你的原始DataFrame名叫df,可以用这段代码选中目标列:
time_cols <- grep("^time\\.", names(df), value = TRUE)
2. 逐行提取最小值与对应列信息
接下来用apply函数逐行处理,提取每行的最小值,以及这个最小值所在的列位置:
# 提取每行的最小时间值 min_time_values <- apply(df[time_cols], 1, min) # 找到最小值在time_cols中的位置,再转换为原始DataFrame的列编号 min_col_pos_in_time <- apply(df[time_cols], 1, which.min) original_min_col_numbers <- match(time_cols[min_col_pos_in_time], names(df)) # 获取原始行编号 row_numbers <- 1:nrow(df)
注:如果某行有多个相同的最小值,which.min会返回第一个出现最小值的列位置,要是你需要保留所有符合条件的列,可以再调整代码逻辑~
3. 组合成目标DataFrame
最后把这些结果整合起来,就是你想要的结构了:
result_df <- data.frame( 行编号 = row_numbers, 列编号 = original_min_col_numbers, 最小时间值 = min_time_values )
用你的示例数据验证
拿你给出的部分数据测试:
h column row time.1 time.2 time.3 time.4 time.5
1 1 1 8262 8262 8262 66357 66357
2 1 2 21386 21386 213...
第一行的最小值是8262,which.min会返回第一个匹配的列(也就是time.1对应的列位置),转换后原始列号是4;第二行的最小值21386对应的列号同样是4,生成的新DataFrame就会清晰展示这些信息。
内容的提问来源于stack exchange,提问作者Coopa
相关产品推荐
相关产品推荐

