R 如何根据缩放数据帧从非缩放数据帧中删除数据
我现在使用的是R,在这里我缩放原始数据,删除所有Z分数为3或更多的异常值,然后过滤掉未缩放的数据,使其只包含非异常值。在删除异常值后,我希望留下一个包含非缩放数字的数据框。这是我的步骤: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现在应
步骤
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