R语言中基于数据框多列非数值变量生成新列的求助
修正基于数据框列生成K_status/S_status新列的R代码
问题说明
现有一个简化的大型数据框df,需要基于A、B、C三列生成K_status和S_status两个新列,但当前编写的代码无法得到预期结果,需修正代码实现需求。
示例数据
A <- c("K", "K", "K", "S", "S", "S", "NA") B <- c("NA", "AA", "AC", "NA", "AA", "AB", "LD") C <- c("TT", "YY", "YY", "TT", "YY", "Y", "TT") df <- data.frame(A, B, C)
当前错误代码
df <- df %>% mutate(K_status = case_when(all("K", "AA", "YY") %in% df) ~ "Mut", TRUE ~ "WT")) %>% mutate(S_status = case_when(all("S", "AB", "Y") %in% df) ~ "Mut", TRUE ~ "WT"))
期望输出
A <- c("K", "K", "K", "S", "S", "S", "NA") B <- c("NA", "AA", "AC", "NA", "AA", "AB", "LD") C <- c("TT", "YY", "YY", "TT", "YY", "Y", "TT") K_status <- c("WT", "Mut", "WT", "WT", "WT", "WT", "WT") S_status <- c("WT", "WT", "WT", "WT", "WT", "Mut", "WT") df <- data.frame(A, B, C, K_status, S_status)
修正后的代码
library(dplyr) df <- df %>% mutate( K_status = case_when( A == "K" & B == "AA" & C == "YY" ~ "Mut", TRUE ~ "WT" ), S_status = case_when( A == "S" & B == "AB" & C == "Y" ~ "Mut", TRUE ~ "WT" ) )
代码说明
原代码错误在于使用all("K", "AA", "YY") %in% df,这是检查整个数据框是否包含这三个值,而非逐行判断当前行的A、B、C列是否分别匹配指定值。修正后的代码直接针对每行的对应列做逻辑与判断,完全匹配需求规则:
- 当某行A="K"、B="AA"、C="YY"时,K_status设为"Mut",否则为"WT"
- 当某行A="S"、B="AB"、C="Y"时,S_status设为"Mut",否则为"WT"
内容的提问来源于stack exchange,提问作者vcat
相关产品推荐
相关产品推荐

