2013-10-02 3 views
3

Я хочу, чтобы удалить столбец, если она инвариантна для [2:nrow(df), ]Удалить инвариантную колонку в R

Просто не могу получить эту работу. Все еще нова для R и программирования в целом.

red <- c(1, 2, 3) 
blue <- c(4, 5, 4) 
green <- c(4, 7, 2) 
colors <- data.frame(red, blue, green) 
colors <- t(colors) 
colors 

     [,1] [,2] [,3] 
red  1 2 3 
blue  4 5 4 
green 4 7 2 

Как удалить столбец 1 логически из-за неизменности синего и зеленого. В частности, нет необходимости отклонять метод удаления столбцов, для которых все одинаковые значения будут выполнять задание.

Большое спасибо!

ответ

3

, чтобы удалить столбец, просто переназначить объект меньше столбец:

colors <- colors[, -1] 
colors 

#  [,1] [,2] 
# red  2 3 
# blue  5 4 
# green 7 2 

Если у вас есть список столбцов для сбрасывания (технически vector, а не R list), использование:

toDrop <- c(<whichever columns to drop>) 
colors <- colors[, -toDrop] 

С другой стороны, если вы знаете, какие вы оставляете:

toKeep <- c(<whichever columns to keep>) 
colors <- colors[, toKeep] 

Что касается определения, если оно инвариантно, используйте duplicated, но не на data.frame напрямую, а на каждой колонке (с помощью функции apply):

toDrop <- apply(colors[2:nrow(colors), ], 2, function(x) all(duplicated(x)[-1])) 

# Optionally: 
toDrop <- which(toDrop) 
if (length(toDrop)) 
    colors <- colors[, -toDrop] 
+1

Я сомневаюсь, что имя заголовка вызывает код потерпеть неудачу. Если вы не делаете что-то другое, чем описано –

+0

Ваш код возвращает TRUE FALSE FALSE и дает ожидаемый результат с помощью [, -todrop]. Мой пример дает, toDrop [2] = HEADER FALSE. Когда я делаю df [, - toDrop], он возвращает dataframe с 0 столбцами. Таким образом, это не подводит, но оно не работает должным образом. – user2795569

+0

Вы правы. Это не заголовки, которые заставляют его терпеть неудачу, но что-то есть. – user2795569

Смежные вопросы