如何从ListW列取最小值并保留对应conn列值(R语言)
解决R数据框中分隔列的最小值匹配问题
原始数据
df <- data.frame(A = c(1, 2, 3, 4), conn = c("2, 3, 4", "8, 1, 6", "4, 6, 1, 5", "5, 9, 1, 3"), ListW = c("100, 100, 100", "60, 100, 100", "100, 50, 100, 100", "100, 10, 100, 100"))
需求目标
为每行数据找到ListW列中的最小值,同时保留该最小值对应的conn列元素(若多个元素对应相同最小值则全部保留),最终生成包含A、Nconn(匹配的conn元素)、minListW(最小值)的新数据框。
完整解决方案代码
# 原始数据定义 df <- data.frame(A = c(1, 2, 3, 4), conn = c("2, 3, 4", "8, 1, 6", "4, 6, 1, 5", "5, 9, 1, 3"), ListW = c("100, 100, 100", "60, 100, 100", "100, 50, 100, 100", "100, 10, 100, 100")) # 拆分conn和ListW列,得到对应元素列表 conn_elements <- strsplit(df$conn, ", ") listw_elements <- strsplit(df$ListW, ", ") # 逐行匹配最小值对应的conn元素 processed_rows <- mapply(function(conn_vals, listw_vals) { # 将ListW元素转为整数类型 listw_int <- as.integer(listw_vals) # 确定当前行的最小值 min_val <- min(listw_int) # 筛选出所有对应最小值的conn元素 matched_conns <- conn_vals[listw_int == min_val] # 返回整理后的结果 list(Nconn = paste(matched_conns, collapse = ", "), minListW = as.character(min_val)) }, conn_elements, listw_elements, SIMPLIFY = FALSE) # 合并结果与原数据的A列,生成最终数据框 final_df <- cbind(df["A"], do.call(rbind, processed_rows)) # 输出结果 print(final_df)
代码说明
- 拆分列数据:使用
strsplit将conn和ListW的分隔字符串拆分为元素列表,保证两组列表的元素位置一一对应; - 逐行处理:通过
mapply遍历每一行的两组列表,将ListW元素转为整数后找到最小值,再筛选出conn中位置匹配的元素; - 结果合并:将每行处理后的结果合并为数据框,与原数据的
A列组合得到目标输出。
内容的提问来源于stack exchange,提问作者Rakesh Nandi
相关产品推荐
相关产品推荐

