2017-08-31 90 views
0

我有一个数据帧,其中有超过100列和10000行。如果该列中的所有行都相同,则手动检查每列中的数据,然后将其删除变得越来越困难。R - 从数据帧中删除列(如果它们相同)

所以,我正在寻找一个函数,将我的数据帧作为输入和输出另一个数据帧,将只有列不相同的列。

输入数据帧将是这样的:

data<- read.table(text = " 
A B C D 
1 1 3 4 
1 2 2 4", header = TRUE) 

,我想输出数据帧为:

B C 
1 3 
2 2 

感谢。

+0

@Henrik其实,我本可以应用它。但我正在学习。不好意思,朋友。发现非常难以理解这种安乐,乐于和运用概念。 – Sid29

回答

3

使用sapply浏览每列。然后,对于每一列检查是否所有元素都等于第一个元素。的microbenchmark

data[!sapply(data, function(x) all(x == x[1]))] 
# B C 
#1 1 3 
#2 2 2 

结果如下所示。需要注意的是db()在这种情况下是

db = function(){ 
    df[!sapply(df, function(x) all(x == x[1]))] 
} 

所有其它功能和数据均来自coffeinjunky's answer

with(microbenchmark(db(), ak(), ak2(), ak3(), cj(), cj2()), 
    boxplot(x = split(time/1e6, expr), outline = FALSE, ylab = "milliseconds")) 

enter image description here

4

一种选择是Filter只保留有其unique元素大于1

Filter(function(x) length(unique(x))>1, data) 
# B C 
#1 1 3 
#2 2 2 

或其他选项length列是sapply

data[sapply(data, function(x) length(unique(x)))>1] 

或用anyDuplicated

data[!sapply(data, anyDuplicated)] 
4

就在这里补充几个选项:

如果所有的元素都是相同的,这意味着最小值和最大值将是相同的。请注意,这些是高度优化的内置功能。同样,如果所有元素都是相同的,方差为0。代码:

df[, !sapply(df, function(x) min(x) == max(x))] 
df[, !sapply(df, function(x) var(x) == 0)] # if all numeric 

如果它是一个性能问题,让我们比较:

# 100 columns and 10000 rows with duplicates: 
df <- data.frame(
    matrix(rnorm(10000*50),ncol=50),  # 50 columns, non-repeating 
    matrix(1:50, ncol=50)[rep(1,10000),] # 50 columns, identical elements 
) 

ak <- function(){ 
    Filter(function(x) length(unique(x))>1, df) 
} 
ak2 <- function(){ 
    df[sapply(df, function(x) length(unique(x)))>1] 
} 
ak3 <- function(){ 
    df[!sapply(df, anyDuplicated)] 
} 
cj <- function(){ 
    df[, !sapply(df, function(x) var(x) == 0)] 
} 
cj2 <- function(){ 
    df[, !sapply(df, function(x) min(x) == max(x))] 
} 

library(microbenchmark) 
microbenchmark(ak(), ak2(), ak3(), cj(), cj2())  

Unit: milliseconds 
    expr   min   lq  mean  median   uq   max neval 
    ak() 17.472319 17.870399 19.586547 19.040228 19.762838 66.545086 100 
ak2() 17.412296 18.152165 19.830981 19.127153 19.908074 65.856221 100 
ak3() 11.359604 11.608405 12.475312 11.939775 12.966077 18.132573 100 
    cj() 6.799404 7.043694 7.466027 7.175871 7.472253 10.451793 100 
cj2() 4.068508 4.237848 4.306551 4.279522 4.373600 4.901368 100 

内置的minmax功能是所谓高优化,这说明了良好的性能。考虑到所涉及的许多计算(计算平均值,从所有元素中减去平均值,平方和,求和),我几乎感到惊讶var == 0做得很好。

相关问题