Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R dplyr方法变异变量(如果存在)_R_Dplyr - Fatal编程技术网

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

R dplyr方法变异变量(如果存在),r,dplyr,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 %>

作为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
}
#加载库
图书馆(dplyr)
#创建数据帧

df1您可以使用
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
为了澄清,当无法从
vars
变量解析列名时,警告消息由
one\u
发出:

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

如果您想进一步消除警告消息,请接受@Gregor的评论,您可以将
mutate_at
if/else
一起使用,如果列中不存在
foo
,则返回
整数(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

使用一个基本的管道操作,我相信是不受约束的。也尽量不要使用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)
    }
}
#加载库
图书馆(dplyr)
#创建数据帧

df1基于Psidom应答,您还可以安静地使用
来避免警告:

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

什么是
colname
?一个
if
语句怎么样:
if(“foo”在names(df)中)…
@Gregor必须是
%in%
,见我的答案谢谢。很好用!此解决方案在函数(整洁数据概念)中的许多其他管道(%%>%)上效果不佳。Psidom的答案对我很好。
# 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)
    }
}
df2 %>%
  mutate_at(vars(quietly(one_of)("foo","boo",  .vars = tidyselect::peek_vars())$result),
            as.factor)