大家。我已经想出如何基于满足数据帧中另一列的某些条件来替换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中保留值,就像在其他列中进行替换一样。有关如何完成此任务的任何建议?
谢谢!
答案 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