有条件地替换值而不影响原始列条件语句是基于

时间:2016-02-17 23:00:30

标签: r conditional

大家。我已经想出如何基于满足数据帧中另一列的某些条件来替换R中的值。但是,我写的代码似乎将条件语句应用于我基于条件的原始列。基本上,我希望在数据框的所有列中替换值,除了,用于生成规则/条件的列。

以下是样本数据(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中保留值,就像在其他列中进行替换一样。有关如何完成此任务的任何建议?

谢谢!

2 个答案:

答案 0 :(得分:2)

对列选择使用否定索引:

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
# ....

答案 1 :(得分:0)

尝试此操作:创建列C6的副本并将其命名为dupC6。然后运行代码,使所有内容为0.接下来将dupC6的值​​与C6交换。我确定有更好的方法。

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