2016-02-12 148 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