在管道操作员之后使用ifelse

时间:2018-04-09 11:02:43

标签: r dplyr

我希望将两个函数中的一个应用于vector的元素。根据向量的值选择使用哪种函数。

具体来说:想象一下你想要转换两位数的年份(例如' 07'对于' 2007'' 85'对于' 1985年')四位数,假设所有日期都在1919年到2018年之间。

因此,您必须将1900添加到大于18的数字,并将2000添加到其他数字。

现在我想用%>%运算符执行此操作(以后可以在mutate语句中使用它。)

这一个:

c(18,20,21,15) %>% ifelse(.>18, .+1900, .+2000)

产生错误:

Error in ifelse(., . > 18, . + 1900, . + 2000) : unused argument (. + 2000)

我甚至理解为什么:%>%强制将矢量c(18,20,21,15)用作ifelse的第一个参数。

我有一个使用匿名函数的解决方法:

c(18,20,21,15) %>% (function(x) ifelse(x>18, x+1900, x+2000))
[1] 2018 1920 1921 2015

你能建议什么来避免它们(它们是匿名函数)吗?

2 个答案:

答案 0 :(得分:3)

如果你只是添加花括号,你的解决方案就可以了。

c(18,20,21,15) %>% {ifelse(.>18, .+1900, .+2000)}
# [1] 2018 1920 1921 2015

您也可以这样做以避免{}

c(18,20,21,15) %>% `+`(1900+100*(.<=18))

magrittr

library(magrittr)
c(18,20,21,15) %>% add(1900+100*(.<=18))

保留ifelse

c(18,20,21,15) %>% add(ifelse(.>18,1900,2000))

答案 1 :(得分:2)

这是标准的管道行为:左边的元素作为一个整体用作右边函数的第一个参数(这里没有矢量化)。

这是with open("t.png", "rb") as imageFile: imagestr = base64.b64encode(imageFile.read()) with open("imageToSave.png", "wb") as imgFile: imgFile.write(base64.b64decode(imagestr)) 的解决方案:

purrr::map_dbl

如果您想将其与{dplyr}一起使用,我强烈建议您切换到purrr::map_dbl(c(18,20,21,15), ~ ifelse(.>18, .+1900, .+2000)) [1] 2018 1920 1921 2015

case_when