2016-02-12 17 views
5

Ho un frame di dati che contiene sia colonne numeriche e non numerici, diconoselezionare colonne numeriche e una colonna specificati dal nome dalla data frame

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

Per selezionare solo le colonne non numerici userei

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

Ma ora voglio anche includere una colonna numerica specifica, ad esempio v2. Il mio frame di dati è molto grande e l'ordine delle colonne cambia, quindi non posso indicizzarlo usando un numero, voglio davvero usare il nome 'v2'. Ho provato

fixCol$v2 = TRUE 

ma che mi dà l'avvertimento In fixCol$FR = TRUE : Coercing LHS to a list che rende impossibile al sottoinsieme il mio telaio dati originali per ottenere solo fixCol

df[,fixCol] 

dà: Error in .subset(x, j) : invalid subscript type 'list'

Alla fine il mio obiettivo è per ridimensionare tutte le colonne numeriche del mio frame di dati eccetto questa colonna specificata, usando qualcosa come questo

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

Come posso fare al meglio?

risposta

3

Possiamo utilizzare una condizione OR (|) per ottenere un indice logico e quindi impostare le colonne di "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

questo funziona alla grande, grazie! Come faccio a creare df2 che contiene tutte le colonne NON inserite in df1, senza invertire l'intera affermazione? Ho provato df2 <- df [,! Names (df1)] o df2 <- df [, - c (nomi (df1))] ma entrambi danno un errore. Ho bisogno anche di df2 per poter scalare df2 e metterlo in un nuovo dataframe insieme a df1. – Ciska

+0

@Ciska Possiamo usare 'setdiff' o'% in% 'i.e. df2 <- df [setdiff (nomi (df), nomi (df1))]' – akrun

+1

Grazie a @akrun! Funziona alla grande – 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

grazie, funziona! La risposta di Akrun usa un po 'meno linee ma sono felice con entrambi. Grazie ancora! – Ciska

Problemi correlati