在R中拼接DataFrame非“ok”值并生成新列的实现方法
解决方案
方法一:使用dplyr的行操作
通过rowwise()实现逐行处理,结合c_across()选中目标列,筛选非"ok"值后拼接:
library(dplyr) # 构造原始数据 A = c("ok","WA","WA","ok","WA") B = c("WB","ok","ok","ok","WB") C = c("WC","ok","WC","ok","WC") df = tibble(A,B,C) # 生成新列D df <- df %>% rowwise() %>% mutate(D = { # 提取当前行非"ok"的所有值 non_ok_vals <- c_across(A:C)[c_across(A:C) != "ok"] # 根据是否有非ok值返回对应结果 if (length(non_ok_vals) == 0) "NO W" else paste(non_ok_vals, collapse = ",") }) %>% ungroup() # 查看结果 df
方法二:使用purrr的函数式逐行处理
如果偏好函数式编程风格,可以用pmap_chr()逐行遍历数据框:
library(dplyr) library(purrr) # 构造原始数据(如果已定义可跳过) A = c("ok","WA","WA","ok","WA") B = c("WB","ok","ok","ok","WB") C = c("WC","ok","WC","ok","WC") df = tibble(A,B,C) # 生成新列D df <- df %>% mutate(D = pmap_chr(., ~{ # 获取当前行的所有值 row_vals <- c(...) # 筛选非"ok"值 non_ok_vals <- row_vals[row_vals != "ok"] # 返回拼接结果或默认文本 if (length(non_ok_vals) == 0) "NO W" else paste(non_ok_vals, collapse = ",") })) # 查看结果 df
两种方法都能得到预期结果,方法一贴合dplyr管道风格,方法二更适合处理复杂逐行逻辑。
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

