R 如何根据缩放数据帧从非缩放数据帧中删除数据

R 如何根据缩放数据帧从非缩放数据帧中删除数据,r,dataframe,R,Dataframe,我现在使用的是R,在这里我缩放原始数据,删除所有Z分数为3或更多的异常值,然后过滤掉未缩放的数据,使其只包含非异常值。在删除异常值后,我希望留下一个包含非缩放数字的数据框。这是我的步骤: 步骤 1.创建相同数据的两个数据帧(x,y) 2.缩放x并保持y不缩放。 3.过滤掉x中Z分数大于3的所有行 4.例如,当前,x可能有95000行,而y仍有100000行 5.基于名为行ID的唯一列截断y,我确保该列在x中没有标度。这个独特的列将帮助我匹配x中的剩余行和y中的行。 6. y现在应

我现在使用的是R,在这里我缩放原始数据,删除所有Z分数为3或更多的异常值,然后过滤掉未缩放的数据,使其只包含非异常值。在删除异常值后,我希望留下一个包含非缩放数字的数据框。这是我的步骤:

步骤
1.创建相同数据的两个数据帧(x,y
2.缩放x并保持y不缩放。
3.过滤掉x中Z分数大于3的所有行
4.例如,当前,x可能有95000行,而y仍有100000行
5.基于名为行ID的唯一列截断y,我确保该列在x中没有标度。这个独特的列将帮助我匹配x中的剩余行和y中的行。
6. y现在应具有与x相同的行数,但数据未标度x具有缩放数据

目前,我无法对数据进行无标度处理。我尝试使用unscale方法或数据帧比较工具,但R抱怨我无法处理两种不同大小的数据帧。有解决办法吗

尝试

我已经尝试了
dataFrame,如果我正确理解了您想要做的事情,我建议使用不同的方法。您可以使用两个
data.frames
,但是如果使用
dplyr
包,您可以在一行代码中完成所有操作。。。大概也会更快

首先,我生成一个包含100k行的
data.frame
,它有一个
ID
列(仅1:100000序列)和一个
值(随机数)

代码如下:

library(dplyr)

#generate data
x <- data.frame(ID=1:100000,value=runif(100000,max=100)*runif(10000,max=100))

#take a look

> head(x)
  ID      value
1  1  853.67941
2  2  632.17472
3  3 3089.60716
4  4 8448.89408
5  5 5307.75684
6  6   19.07485
如果查看这些行,您将看到过滤工作正常

> cat('Rows of X:',nrow(x),'- Rows of xclean:',nrow(xclean))
Rows of X: 100000 - Rows of xclean: 99575
虽然数据看起来像原始的
data.frame

> head(xclean)
  ID      value
1  1  853.67941
2  2  632.17472
3  3 3089.60716
4  4 8448.89408
5  5 5307.75684
6  6   19.07485
最后,通过比较两个
数据的
ID
s,您可以看到观察结果已被过滤掉。frame
s:

> head(x$ID[!is.element(x$ID,xclean$ID)],50)
 [1]    68    90   327   467   750   957  1090  1584  1978  2106  2306  3415  3511  3801  3855  4051
[17]  4148  4244  4266  4511  4875  5262  5633  5944  5975  6116  6263  6631  6734  6773  7320  7577
[33]  7619  7731  7735  7889  8073  8141  8207  8966  9200  9369  9994 10123 10538 11046 11090 11183
[49] 11348 11371

编辑: 当然,2数据帧版本也是可能的:

y <- x

# calculate zscore
x$value <- (x$value - mean(x$value))/sd(x$value)

#subset y
y <- y[x$value<3,]

# initially 100k rows
> nrow(y)
[1] 99623
现在不使用dplyr的解决方案(我将基于
x
生成布尔索引,而不是使用2个数据帧):

# select variables
vars_to_process <-  grep('value',colnames(x),value=T)

# create index ZS < 3
ix <- apply(x[vars_to_process],2,function(x) (x-mean(x))/sd(x) < 3)

#filter rows
xclean <- x[rowSums(ix) == length(vars_to_process),]

> nrow(xclean)
[1] 98832
#选择变量

vars_to_process Whoah我必须对此进行一次运行。这看起来非常好!我会在尝试后立即与您联系。编辑:如果我需要在多个列上应用此函数,请编辑?在示例中显示一个“value”列。如何通过X列(不包括RowID)?
#generate data
set.seed(21)
x <- data.frame(ID=1:100000,value1=runif(100000,max=100)*runif(10000,max=100),
                value2=runif(100000,max=100)*runif(10000,max=100),
                value3=runif(100000,max=100)*runif(10000,max=100))

    > head(x)
  ID    value1     value2      value3
1  1 2103.9228 5861.33650  713.885222
2  2  341.8342 3940.68674  578.072141
3  3 5346.2175  458.07089    1.577347
4  4  400.1950 5881.05129 3090.618355
5  5 7346.3321 4890.56501 8989.248186
6  6 5305.5105   38.93093  517.509465
# make sure you got a recent version of dplyr
> packageVersion('dplyr')
[1] ‘0.7.2’

# define zscore function:
zscore <- function(x){(x-mean(x))/sd(x)}

# select variables (could also be manually with c())
vars_to_process <-  grep('value',colnames(x),value=T)


# calculate zscores and filter

xclean <- x %>% mutate_at(.vars=vars_to_process, .funs=funs(ZS = zscore(.))) %>%
                filter_at(vars(matches('ZS')),all_vars(.<3)) %>% 
                select(-matches('ZS'))

> nrow(xclean)
[1] 98832
# select variables
vars_to_process <-  grep('value',colnames(x),value=T)

# create index ZS < 3
ix <- apply(x[vars_to_process],2,function(x) (x-mean(x))/sd(x) < 3)

#filter rows
xclean <- x[rowSums(ix) == length(vars_to_process),]

> nrow(xclean)
[1] 98832