作为dplyr的忠实粉丝及其整洁的数据概念,我想在数据帧中存在特定变量时进行变异。这就是这个想法:
# Load libraries
library(dplyr)
# Create data frames
df1 <- data.frame(year = 2000:2010, foo = 0:10)
df2 <- data.frame(year = 2000:2010)
# Create function
cnd_mtt <- function(df){
df %>%
mutate_if(colname == "foo", as.factor) # <---- this is the tricky part
}
预期结果:该功能应适用于两个数据帧且无错误
想法?
答案 0 :(得分:4)
您可以将mutate_at
与one_of
一起使用,如果该列不存在,则会发出警告消息:
cnd_mtt <- function(df){
df %>%
mutate_at(vars(one_of('foo')), as.factor)
}
cnd_mtt(df2)
# year
#1 2000
#2 2001
#3 2002
#4 2003
#5 2004
#6 2005
#7 2006
#8 2007
#9 2008
#10 2009
#11 2010
Warning message: Unknown variables: `foo`
为了澄清,当one_of
无法解析vars
变量中的列名时,one_of('foo', vars = names(df1))
# [1] 2
one_of('foo', vars = names(df2))
# integer(0)
会引发警告消息:
Warning message:
Unknown variables: `foo`
mutate_at
如果您想要进一步消除警告信息,请参阅@ Gregor的评论,您可以if/else
使用integer(0)
,如果foo
没有,则返回df2 %>%
mutate_at(if('foo' %in% names(.)) 'foo' else integer(0), as.factor)
# year
#1 2000
#2 2001
#3 2002
#4 2003
#5 2004
#6 2005
#7 2006
#8 2007
#9 2008
#10 2009
#11 2010
列中不存在:
input
答案 1 :(得分:0)
使用基本的管道操作,我不相信dplyr。另请尽量不要将df用作变量名
# Load libraries
library(dplyr)
# Create data frames
df1 <- data.frame(year = 2000:2010, foo = 0:10)
df2 <- data.frame(year = 2000:2010)
# Create function
cnd_mtt <- function(dff,colname){
if (colname %in% names(dff)){
dff%>%mutate(new_col=some.transformation)
}
}
答案 2 :(得分:0)
基于Psidom答案,您也可以使用quietly
来避免警告:
df2 %>%
mutate_at(vars(quietly(one_of)("foo","boo", .vars = tidyselect::peek_vars())$result),
as.factor)