【问题标题】:dplyr mutate combined with replace: why does replace fail to identify the condition?dplyr mutate 与 replace 结合使用:为什么 replace 无法识别条件?
【发布时间】:2018-02-22 15:02:33
【问题描述】:

我有这些名为 msa 的数据:

BN  MC
1   1A
2   2  
3   1B
4   4
5   2

我想执行以下操作:

  lala<-msa%>%
  mutate(mc=replace(mc, (mc=="1A"|mc=="1B"),50))%>%
  mutate(df= NA)%>%
  mutate(df=replace(df, mc> 3, 1))%>%
  as.data.frame()

有效,

BN  MC  df
1   50   1
2   2    NA
3   50   1
4   4    1
5   2    NA

但是,如果我使用上面相同的代码替换为 10、100 或 1000 而不是 50:

 lala<-msa%>%
  mutate(mc=replace(mc, (mc=="1A"|mc=="1B"),10))%>%
  mutate(df= NA)%>%
  mutate(df=replace(df, mc> 3, 1))%>%
  as.data.frame()

我明白了:

  BN  MC  df
1   50   NA
2   2    NA
3   50   NA
4   4    1
5   2    NA

为什么“替换”似乎只读取第一个数字来决定是否替换?


编辑 基于 MKR 答案的工作代码

lala<-msa%>%
  mutate(mc=replace(mc, (mc=="1A"|mc=="1B"),10))%>%

  lala[,]<-sapply(lala[,],as.numeric) #makes lala completely numeric

  lala<-mutate(lala,df= NA)%>%
  mutate(df=replace(df, mc> 3, 1))%>%
  as.data.frame()

【问题讨论】:

  • 我的猜测是您在运行replace(..., 50) 之后在同一数据帧上运行replace(..., 10)。因此没有1A1B...
  • 适合我
  • @Sotos 不。即使我这样做,lala 也会被覆盖,所以这不是问题。

标签: r replace dplyr


【解决方案1】:

我认为原因是MC 列是chr 类型。因此,在检查MC&gt; 3 时,MC 是coerced 编号。 (只有第一个字符是coerced)。因此100 将是1。任何像5080 这样的值在MC 上都会使MC &gt; 3 成为TRUE,否则它的FALSE。如果条件被评估为TRUE,则DF 的值为1,否则为NA

msa%>%
  mutate(MC=replace(MC, (MC=="1A"|MC=="1B"),1000))%>%
  mutate(df= NA)%>%
  mutate(df=replace(df, MC> 3, 1))%>%
  as.data.frame()

以下测试将有助于理解问题。

> ch = "80"
> ch > 3
[1] TRUE
> ch = "100"
> ch > 3
[1] FALSE

通过将MC 替换为as.numeric(MC) 来修改命令将使其适用于甚至100。

msa%>%
  mutate(MC=replace(MC, (MC=="1A"|MC=="1B"),1000))%>%
  mutate(df= NA)%>%
  mutate(df=replace(df, as.numeric(MC)> 3, 1))%>%
  as.data.frame()

#  BN   MC df
#1  1 1000  1
#2  2    2 NA
#3  3 1000  1
#4  4    4  1
#5  5    2 NA

【讨论】:

  • 这解开了谜团。我已经编辑了我的问题(最后),以展示我最终是如何根据您的回答进行编码的。谢谢
猜你喜欢
  • 1970-01-01
  • 2019-02-19
  • 2012-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多