mapply尝试将公式应用于两列时出错

时间:2014-12-17 12:15:23

标签: r

运行以下代码时出现错误

 TransPSnoNA <- mapply(noNA,x = TransPerSend1[,2],y = TransPerSend1[,3])

noNA是一个将NA替换为0的函数,如果我在一列上使用sapply,则该函数可用。

noNA <- function(x) if(is.na(x)==TRUE){x=0}else{x}

示例数据集如下所示:

Col1 Col2 Col3
1    2    3
2    NA    3
2    4    NA

我收到错误:

Error in (function (x)  : unused argument (y = dots[[2]][[1]])

我尝试设置SIMPLIFY = FALSE,但这也不起作用。有什么帮助吗?

据我了解,mapply允许我一次在数据框中的两列使用函数(在我的情况下为noNA)。在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这似乎有效

 TransPerSend1[2:3] <- t(mapply(function(x,y) replace(c(x,y),
            is.na(c(x,y)), 0), TransPerSend1[,2], TransPerSend1[,3]))

但是,我认为这可以更好地解决

TransPerSend1[,2:3][is.na(TransPerSend1[,2:3])] <- 0

甚至

 TransPerSend1[2:3] <- lapply(TransPerSend1[,2:3],
                     function(x) replace(x, is.na(x),0))

更新

关于错误消息,noNA函数只有一个参数。假设,如果是:

 noNA <- function(x,...) if(is.na(x)==TRUE){x=0}else{x}

它仍会评估x

 mapply(noNA,x = TransPerSend1[,2],y = TransPerSend1[,3])
 #[1] 2 0 4

t的原因是因为,我使用的代码给出了一个包含3列和2行的输出,应该转换为按预期获得2列。

 #      [,1] [,2] [,3]
 #[1,]    2    0    4
 #[2,]    3    3    0

数据

TransPerSend1 <- structure(list(Col1 = c(1L, 2L, 2L), Col2 = c(2L, NA, 4L), 
 Col3 = c(3L, 3L, NA)), .Names = c("Col1", "Col2", "Col3"), class = "data.frame", 
 row.names = c(NA, -3L))