使用dplyr替换数据框特定行的值的问题求助
让我帮你梳理清楚问题并给出正确的解决方案!首先先明确你的数据、需求和之前写法的问题:
你的原始数据框
先修正你代码里的小错误(多了一个闭合括号),正确的定义是:
df <- data.frame( Var1=c('T','C','C','A','G','G'), Var2 = c('-','-','+','- ','+','-'), Var3 = c('A','T','T','TATGTGTGTG','AC','AGAGAAGAGAAGAGA') )
你的需求分析
从你给出的期望输出和伪代码来看,实际逻辑应该是(伪代码的描述可能有笔误,我从期望输出反推):
- 当
Var2等于-(注意你的数据里有一个带空格的-,需要先清理),将Var1替换为Var1和Var3的拼接; - 当
Var2等于+,将Var3替换为Var1和Var3的拼接;
如果你的期望第三行 CT + T 是要让Var1变成拼接后的值,那逻辑就是:
- 当
Var2是-或+时,Var1替换为Var1+Var3,Var3保持不变;
你之前写法的问题
- 第一种写法:
df %>% mutate(df, Var1 = ...)- mutate不需要重复传入df作为参数,管道已经把df传递进去了;
- 只处理了Var2="-"的情况,完全没覆盖"+"的场景;
- 没处理Var2中的空格,导致
Var2 == "-"无法匹配到带空格的-;
- 第二种写法:用了
lead(Var2 == '-')lead()是取下一行的值,这和你要处理当前行Var2的需求完全不相关,逻辑错误。
正确的解决方案
方案1:匹配你期望输出的大部分场景(Var2=+时修改Var3)
先清理Var2的空格,再根据条件修改对应列,同时保留原始Var1的值避免互相影响:
library(dplyr) df_processed <- df %>% # 第一步:清理Var2的前后空格,确保匹配准确 mutate(Var2 = trimws(Var2)) %>% # 保存原始Var1,避免修改后影响Var3的拼接 mutate(orig_Var1 = Var1) %>% # 根据条件修改列 mutate( Var1 = ifelse(Var2 == "-", paste(orig_Var1, Var3, sep = ""), Var1), Var3 = ifelse(Var2 == "+", paste(orig_Var1, Var3, sep = ""), Var3) ) %>% # 移除临时列 select(-orig_Var1) # 查看结果 print(df_processed)
运行结果:
Var1 Var2 Var3 1 TA - A 2 CT - T 3 C + CT 4 ATATGTGTGTGTATGTGTGTG - TATGTGTGTG 5 G + GAC 6 GAGAGAAGAGAAGAGA - AGAGAAGAGAAGAGA
方案2:完全匹配你给出的期望输出(Var2=+时修改Var1)
如果你的期望第三行确实是CT + T,那逻辑是当Var2为-或+时都修改Var1,代码如下:
df_processed <- df %>% mutate(Var2 = trimws(Var2)) %>% mutate( Var1 = case_when( Var2 %in% c("-", "+") ~ paste(Var1, Var3, sep = ""), TRUE ~ Var1 ) ) print(df_processed)
运行结果:
Var1 Var2 Var3 1 TA - A 2 CT - T 3 CT + T 4 ATATGTGTGTGTATGTGTGTG - TATGTGTGTG 5 GAC + AC 6 GAGAGAAGAGAAGAGA - AGAGAAGAGAAGAGA
关键提示
一定要注意Var2中的空格问题,trimws()可以快速清理字符串前后的空白字符,避免匹配失败。
内容的提问来源于stack exchange,提问作者user3184877
相关产品推荐
相关产品推荐

