R中的匿名函数未返回预期输出

时间:2018-07-31 22:59:55

标签: r functional-programming anonymous-function

我有这个数据框:

df <- data.frame(c(NA,2,3,1),c(4,NA,6,1),c(7,8,NA,9),c(1,5,6,4))
colnames(df) <- c('x1','x2','x3','x4')`

如果我编写一个简单的插补函数来插补NA值,如下所示:

impute <- function(x, imputation.method) { 
x[is.na(a)] <- imputation.method
x
}

并在原始数据帧的前两列中调用它。它将正确估算NA值,如下所示:

library(purrr)
df[,c('x1', 'x2')] <- map(df[,c('x1', 'x2')], impute, 0)
df

# x1 x2 x3 x4    
# 0  4  7  1     
# 2  0  8  5     
# 3  6 NA  6    
# 1  1  9  4  

然后,如果我尝试使用匿名函数在单行代码中执行此操作,它将返回以下不良输出:

df[,c('x1', 'x2')] <- map(df[,c('x1', 'x2')], function(x){x[is.na(x)] <- 0 })

# x1 x2 x3 x4    
# 0  0  7  1     
# 0  0  8  5     
# 0  0 NA  6    
# 0  0  9  4    

我不知道为什么重写我的原始函数与单行匿名函数一样会改变输出。关于为什么发生这种情况以及如何更改匿名函数以返回所需输出的任何输入,都将受到赞赏!

1 个答案:

答案 0 :(得分:3)

你去了!

  df[,c('x1', 'x2')] <- map(df[,c('x1', 'x2')], function(x){x[is.na(x)] <- 0;x })
  #   x1 x2 x3 x4
  # 1  0  4  7  1
  # 2  2  0  8  5
  # 3  3  6 NA  6
  # 4  1  1  9  4

您的函数正在返回0,它需要返回修改后的x

这是另一种写法:

mutate_at(df, c('x1', 'x2'), ~`[<-`(., is.na(.), value = 0))