R dplyr方法mutate变量(如果存在)

时间:2018-01-19 16:41:36

标签: r dplyr

作为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
}

预期结果:该功能应适用于两个数据帧且无错误

想法?

3 个答案:

答案 0 :(得分:4)

您可以将mutate_atone_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)