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