Условно удалить столбцы в R - PullRequest
0 голосов
/ 11 июля 2011

Я знаю, как удалить столбцы в R, но я не уверен, как удалить их на основе следующего набора условий.Предположим, фрейм данных, как:

DF <- data.frame(L = c(2,4,5,1,NA,4,5,6,4,3), J= c(3,4,5,6,NA,3,6,4,3,6), K= c(0,1,1,0,NA,1,1,1,1,1),D = c(1,1,1,1,NA,1,1,1,1,1))
 DF
   L  J  K  D
1  2  3  0  1
2  4  4  1  1
3  5  5  1  1
4  1  6  0  1
5 NA NA NA NA
6  4  3  1  1
7  5  6  1  1
8  6  4  1  1
9  4  3  1  1
10 3  6  1  1

Фрейм данных должен быть настроен таким образом.Столбец K соответствует столбцу L, а столбец D соответствует столбцу J. Поскольку столбец D имеет значения, которые все равны единице, я хотел бы удалить столбец D и соответствующий столбец J, дающий кадр данных, который выглядит следующим образом:

 DF
    L  K
1   2  0
2   4  1
3   5  1
4   1  0
5  NA NA
6   4  1
7   5  1
8   6  1
9   4  1
10  3  1

Я знаю, что для этого должна быть простая команда, я просто не могу думать ни о какой.И если это что-то меняет, NA должны быть сохранены.

Дополнительная полезная информация, в моем реальном фрейме данных всего 20 столбцов, поэтому есть 10 столбцов, таких как L и J, иеще 10, которые похожи на K и D, мне нужна функция, которая может распознавать соответствие между этими двумя группами и соответственно удалять столбцы

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 11 июля 2011

Окей, при условии соответствия номера столбца, вот пример:

> n <- 10
> 
> # sample data
> d <- data.frame(lapply(1:n, function(x)sample(n)), lapply(1:n, function(x)sample(2, n, T, c(0.1, 0.9))-1))
> names(d) <- c(LETTERS[1:n], letters[1:n])
> head(d)
   A B  C D E  F  G H  I  J a b c d e f g h i j
1  5 5  2 7 4  3  4 3  5  8 0 1 1 1 1 1 1 1 1 1
2  9 8  4 6 7  8  8 2 10  5 1 1 1 1 1 1 1 1 1 1
3  6 6 10 3 5  6  2 1  8  6 1 1 1 1 1 1 1 1 1 1
4  1 7  5 5 1 10 10 4  2  4 1 1 1 1 1 1 1 1 1 1
5 10 9  6 2 9  5  6 9  9  9 1 1 0 1 1 1 1 1 1 1
6  2 1  1 4 6  1  5 8  4 10 1 1 1 1 1 1 1 1 1 1
> 
> # find the column that should be left.
> idx <- which(colMeans(d[(n+1):(2*n)], na.rm = TRUE) != 1)
> 
> # filter the data
> d[, c(idx, idx+n)]
    A  B  C  D  F a b c d f
1   5  5  2  7  3 0 1 1 1 1
2   9  8  4  6  8 1 1 1 1 1
3   6  6 10  3  6 1 1 1 1 1
4   1  7  5  5 10 1 1 1 1 1
5  10  9  6  2  5 1 1 0 1 1
6   2  1  1  4  1 1 1 1 1 1
7   8  4  7 10  2 1 1 1 1 0
8   7  3  9  9  4 1 0 1 0 1
9   3 10  3  1  9 1 1 0 1 1
10  4  2  8  8  7 1 0 1 1 1
0 голосов
/ 11 июля 2011

Я в основном согласен с koshke (чья SO работает отлично), но я бы предположил, что используемый тест равен colSums(d[(n+1):(2*n)], na.rm=TRUE) == NROW(d), так как парные 0 и 2 или -1 и 3 могут отбросить тест colMeans.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...