2015-07-22 3 views
0

У меня есть набор данных, который имеет 2200 строк. Я должен удалить большое количество столбцов (например, около 400) за раз. Эти операции происходят довольно часто, и удаляемые столбцы меняются в каждый момент времени. Столбцы, которые нужно удалить, будут находиться в текстовом файле.R: Как динамически удалить столбцы из DataFrame

Вот как я подошел к решению этого вопроса.

#Reading data 
myData = read.csv("myDataFile.csv") 

#Getting the column names which should be deleted 
colToDelete = read.table("columnsToBeRemoved.txt") 

#processing the names list 
tempList = as.character(unlist(colToDelete)) 
cat(paste(shQuote(tempList, type="cmd"), collapse=",")) 

newDataSet = subset(myData, select = - ??) 

Я использую cat(paste(shQuote(tempList, type="cmd"), collapse=",")), чтобы получить список имен, разделенных запятыми. Выход этого

"04_ic_1306", "06_iEC042_1314", "13_iEcDH1_1363", "18_iEcHS_1320", "26_iEcolC_1368", "31_iEcSMS35_1347", "33_iECs_1301", "34_iECUMN_1333", "36_iEKO11_1354", "39_iJO1366", "47_iZ_1308", "54_iSFxv_1172"

Я пробовал подмножество и методы data.table, но мне не повезло с использованием любого из методов. Я получаю ошибку ниже. Я не могу указать строку на , выбрав команду.

Ошибка -a: неверный аргумент для унарного

я был в основном со ссылкой на эту previous stackoverflow question.

+2

Поскольку вы не дали воспроизводимого примера, который я должен угадать, но 'subset (d, select = setdiff (names (d), tempList)' может работать. Для воспроизводимого примера см. http://stackoverflow.com/questions/5963269/как в изготовлении, а пра-р-воспроизводимый-пример/5963610 # 5963610 – kasterma

+0

Эй, Кастерма, извините за предыдущий комментарий. Ваши методы работают отлично. Спасибо за ответ. – SriniShine

ответ

1
b<- "04_ic_1306" 
a[,paste(b)]<-NULL 

Теперь, чтобы сделать это итеративно вы, возможно, придется написать цикл и сохранить имена файлов в массиве, как этот

[1] "04_ic_1306"  "06_iEC042_1314" "13_iEcDH1_1363" "18_iEcHS_1320" 
[5] "26_iEcolC_1368" "31_iEcSMS35_1347" "33_iECs_1301"  "34_iECUMN_1333" 
[9] "36_iEKO11_1354" "39_iJO1366"  "47_iZ_1308"  "54_iSFxv_1172" 
+0

Спасибо Ann283. Ваш метод работает тоже. Но я думаю, что ответ Кастерма должен быть приемлемым ответом. – SriniShine

0

Это может быть решением для вас:

# Create data frame with 5 columns 
df <- data.frame(a=rnorm(10), b=rnorm(10), c=rnorm(10), d=rnorm(10), e=rnorm(10)) 

# Select two columns to be removed 
remove_col <- c("b", "d") 

# Identify them in the column names 
remove_col <- names(df) %in% remove_col 

# Remove them using an inverse (the !) logical vector 
df[,!remove_col] 
Смежные вопросы