2016-02-12 75 views
5

我有一个包含数字和非数字列的数据帧指定数值列一列,说按名称选择从数据帧

df <- data.frame(v1=1:20,v2=1:20,v3=1:20,v4=letters[1:20],v5=letters[1:20]) 

只选择非数字列,我会用

fixCol <- !sapply(df,is.numeric) 

但现在我还想包括一个特定的数字列,比如说v2。我的数据框非常大,列的顺序也发生了变化,所以我不能使用数字对它进行索引,我真的想使用名称'v2'。我试图

fixCol$v2 = TRUE 

但是这给了我这使得它不可能子集我的原始数据帧得到警告In fixCol$FR = TRUE : Coercing LHS to a list只有fixCol

df[,fixCol] 

给出:Error in .subset(x, j) : invalid subscript type 'list'

到底我的目标是除了这一个指定的列,使用类似的东西来缩放我的数据框的所有数字列

scaleCol = !fixCol 
df_scaled = cbind(df[,fixCol], sapply(df[,scaleCol],scale)) 

我该如何做到最好?

回答

3

我们可以使用OR条件(|)来获得逻辑索引,然后将'df'的列子集。

df1 <- df[!sapply(df, is.numeric)|names(df)=='v2'] 
head(df1,2) 
# v2 v4 v5 
#1 1 a a 
#2 2 b b 
+0

这个很好,谢谢!我如何使df2包含所有不放入df1的列,而不反转整个sapply语句?我试过df2 < - df [,!names(df1)]或df2 < - df [, - c(names(df1))]但都出错。 我也需要df2,以便能够缩放df2并将其与df1一起放入新的数据框中。 – Ciska

+0

@Ciska我们可以使用'setdiff'或'%in%',即'df2 < - df [setdiff(names(df),names(df1))]' – akrun

+1

Thanks @akrun!这工作很好 – Ciska

2
fixCol <- !sapply(df,is.numeric) 
fixCol <- df[, fixCol] 
fixCol$v2 <- df[colnames(df)=="v2"] 
head(fixCol) 
# v4 v5 v2 
#1 a a 1 
#2 b b 2 
#3 c c 3 
#4 d d 4 
#5 e e 5 
#6 f f 6 
+1

谢谢,这个作品! akrun的答案使用了少一些的线条,但我对这两种线条感到满意。再次感谢! – Ciska