【问题标题】:Conditionally replacing values without it affecting the original column conditional statement is based on有条件地替换值而不影响原始列条件语句是基于
【发布时间】:2016-02-17 23:00:30
【问题描述】:

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

这里是样本数据(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 中保留值,就像在其他列中进行替换时一样。关于如何做到这一点的任何建议?

谢谢!

【问题讨论】:

  • 您拥有的代码将结果应用于所有列。使用df[df$C6 == "Y",-which(names(df) == "C6")] = 0
  • 谢谢你,@Alex!听起来您和 thelatemail(如下)得出了相同的结论(尽管您使用 -which() 而 thelatemail 使用 -match())。非常感谢!

标签: r conditional


【解决方案1】:

对列选择使用负索引:

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

【讨论】:

  • 谢谢@thelatemail!我没有想过使用负索引——我以前只使用过一次负索引,在前一种情况下使用它更直观(至少对我来说是这样)。 Alex(上图)也提到了负索引。谢谢——非常感谢!
【解决方案2】:

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

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

【讨论】:

  • 谢谢,@MaxPD!实际上,当我自己在 R 中解决问题时,我确实尝试过这个。但我发现这实际上并没有解决我的问题——重复的 C6 列也被我设置的条件规则改变了,所以同样的问题仍然存在。非常感谢您的意见!
猜你喜欢
  • 2019-12-15
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
  • 2014-08-23
  • 2016-12-09
  • 2015-02-01
  • 1970-01-01
相关资源
最近更新 更多