首页 文章

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

提问于
浏览
1

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

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

    警告信息:
    未知变量:foo

    只是为了澄清一下,当 one_of 无法解析 vars 变量中的列名时,会引发警告消息:

    one_of('foo', vars = names(df1))
    # [1] 2
    one_of('foo', vars = names(df2))
    # integer(0)
    

    警告信息:
    未知变量:foo


    如果你想进一步摆脱警告信息,取@gregor的评论,你可以使用 mutate_atif/else ,如果列中不存在 foo 则返回 integer(0)

    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
    
  • 4

    使用基本的管道操作,我不相信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)
        }
    }
    
  • 0

    在Psidom答案的基础上,你也可以使用 quietly 来避免警告:

    df2 %>%
      mutate_at(vars(quietly(one_of)("foo","boo",  .vars = tidyselect::peek_vars())$result),
                as.factor)
    

相关问题