在不影响原始列条件语句的情况下有条件地替换值是基于

Conditionally replacing values without it affecting the original column conditional statement is based on

各位。我已经弄清楚如何根据满足数据框中另一列中的某些条件来替换 R 中的值。但是,我编写的代码似乎将条件语句应用于我基于条件的原始列。基本上,我希望在数据框中的所有列中替换值 除了 用于制作 rule/condition 的列。

这是示例数据 (df):

C1  C2  C3  C4  C5  C6  C7  C8
0   0   0   0   0   Y   0   0
0   0   0   0   0   0   0   Y
0   0   0   0   0   0   0   Y
0   0   0   0   0   0   0   Y
0   0   Y   0   0   0   0   Y
0   0   0   0   0   0   0   Y
0   0   0   0   0   0   0   Y
Y   Y   Y   Y   Y   Y   Y   Y
0   0   0   0   0   0   0   Y
0   0   0   0   0   0   0   Y
0   0   Y   0   0   Y   0   Y
0   0   Y   0   0   0   0   Y
0   0   0   0   0   0   0   Y
0   0   0   0   0   Y   0   0
0   0   0   0   0   0   0   Y
0   0   0   0   0   0   Y   0



我希望每一行都满足以下条件:如果 C6 列中的值为 "Y",我希望将其余列中的值转换为 0。

df[df$C6 == "Y",] = 0      # Most common code I found on SO to accomplish this


当我执行上面的代码行时,它还将此规则应用于 C6 列(将 C6 中的 "Y" 更改为 0)。我不希望这样——我想在其他列中进行替换时保持 C6 中的值不变。关于如何实现这一目标的任何建议?

谢谢!

试试这个:创建 C6 列的副本并将其命名为 dupC6。然后 运行 你的代码使所有内容都为 0。接下来将 dupC6 的值与 C6 交换。不过我相信还有更好的方法。

dupC6<-df$C6
df[df$C6 == "Y",] = 0 
df$C6<-dupC6

对列选择使用负索引:

df[df$C6 == "Y", -match("C6",names(df))] <- 0

#   C1 C2 C3 C4 C5 C6 C7 C8
#1   0  0  0  0  0  Y  0  0
#2   0  0  0  0  0  0  0  Y
#3   0  0  0  0  0  0  0  Y
#4   0  0  0  0  0  0  0  Y
#5   0  0  Y  0  0  0  0  Y
#6   0  0  0  0  0  0  0  Y
#7   0  0  0  0  0  0  0  Y
#8   0  0  0  0  0  Y  0  0
# ....