удаление столбцов с одинаковым значением из фрейма данных - PullRequest
7 голосов
/ 05 декабря 2011

У меня есть такой фрейм данных

1    1    1    K    1    K    K
2    1    2    K    1    K    K
3    8    3    K    1    K    K
4    8    2    K    1    K    K
1    1    1    K    1    K    K
2    1    2    K    1    K    K

Я хочу удалить все столбцы с одинаковым значением, т.е. K, поэтому мой результат будет таким:

1    1    1    1    
2    1    2    1   
3    8    3    1  
4    8    2    1  
1    1    1    1 
2    1    2    1  

Я пытаюсь перебрать столбцы for by, но ничего не получаю.Есть идеи?заранее спасибо

Ответы [ 4 ]

4 голосов
/ 05 декабря 2011

Чтобы выбрать столбцы с более чем одним значением независимо от типа:

uniquelength <- sapply(d,function(x) length(unique(x)))
d <- subset(d, select=uniquelength>1)

?

(Ой, вопрос Романа верен - это также может выбить ваш столбец 5)

Может быть ( изменить : спасибо за комментарии!)

isfac <- sapply(d,inherits,"factor")
d <- subset(d,select=!isfac | uniquelength>1)

или

d <- d[,!isfac | uniquelength>1]
3 голосов
/ 05 декабря 2011

Вот решение, которое будет работать для удаления любых реплицированных столбцов (включая, например, пары реплицированных символьных, числовых или факторных столбцов). Вот как я читаю вопрос ОП, и даже если это неверное прочтение, это тоже интересный вопрос.

df <- read.table(text=" 
1    1    1    K    1    K    K
2    1    2    K    1    K    K
3    8    3    K    1    K    K
4    8    2    K    1    K    K
1    1    1    K    1    K    K
2    1    2    K    1    K    K")

# Need to run duplicated() in 'both directions', since  it considers
# the first example to be **not** a duplicate.
repdCols <- as.logical(duplicated(as.list(df), fromLast=FALSE) + 
                       duplicated(as.list(df), fromLast=TRUE))
# [1] FALSE FALSE FALSE  TRUE FALSE  TRUE  TRUE

df[!repdCols]
#   V1 V2 V3 V5
# 1  1  1  1  1
# 2  2  1  2  1
# 3  3  8  3  1
# 4  4  8  2  1
# 5  1  1  1  1
# 6  2  1  2  1
2 голосов
/ 06 декабря 2011

Раствор Oneliner.

df2 <- df[sapply(df, function(x) !is.factor(x) | length(unique(x))>1 )]
1 голос
/ 05 декабря 2011

Другой способ сделать это - использовать функцию высшего порядка Filter.Вот код

to_keep <- function(x) any(is.numeric(x), length(unique(x)) > 1)
Filter(to_keep, d)
...