有条件地删除R中的列

时间:2011-07-10 22:36:51

标签: r formatting

我知道如何删除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具有全部等于1的值,我想删除列D,并且相应的列J产生看起来像这样的数据帧: p>

 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 个答案:

答案 0 :(得分:3)

Okey,假设基于列号的对应关系,这是一个例子:

> 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

答案 1 :(得分:0)

我基本同意koshke(其SO工作非常出色),但建议使用的测试是colSums(d[(n+1):(2*n)], na.rm=TRUE) == NROW(d),因为配对的0和2或-1和3可能会抛弃colMeans测试。< / p>