R:按列应用规范化函数-大数据帧/数据表

R:按列应用规范化函数-大数据帧/数据表,r,dataframe,normalization,R,Dataframe,Normalization,我有一个大的r data.frame,有近500列。我想添加现有的缩放函数,并以列方式尝试不同的规格化函数 与现有的比例函数相同 library(dplyr) set.seed(1234) dat <- data.frame(x = rnorm(10, 30, .2), y = runif(10, 3, 5), z = runif(10, 10, 20), k = runif(10, 5, 10)) dat %&

我有一个大的r data.frame,有近500列。我想添加现有的缩放函数,并以列方式尝试不同的规格化函数

与现有的比例函数相同

library(dplyr)

set.seed(1234)
dat <- data.frame(x = rnorm(10, 30, .2), 
                  y = runif(10, 3, 5),
                  z = runif(10, 10, 20), k = runif(10, 5, 10))

dat %>% mutate_each_(funs(scale),vars=c("y","z")) 
normalized_columns <- function(x)
{
  r <- (x/sum(x))
}
问题2:我不想使用内置的缩放函数,而是想应用我自己的函数来规范化数据帧

示例:我有以下功能

library(dplyr)

set.seed(1234)
dat <- data.frame(x = rnorm(10, 30, .2), 
                  y = runif(10, 3, 5),
                  z = runif(10, 10, 20), k = runif(10, 5, 10))

dat %>% mutate_each_(funs(scale),vars=c("y","z")) 
normalized_columns <- function(x)
{
  r <- (x/sum(x))
}

normalized_columns有更好的方法,但我通常会这样做:

set.seed(1234)
x = rnorm(10, 30, .2)
y = runif(10, 3, 5)
z = runif(10, 10, 20)
k = runif(10, 5, 10)
a = rnorm(10, 30, .2)
b = runif(10, 3, 5)
c = runif(10, 10, 20)
d = runif(10, 5, 10)

normalized_columns <- function(x)
{
x/sum(x)
}

dat<-data.frame(x,y,z,k,a,b,c,d)
dat[,c(1,4,6:8)]<-sapply(dat[,c(1,4,6:8)], normalized_columns)
set.seed(1234)
x=rnorm(10,30,2)
y=runif(10,3,5)
z=runif(10,10,20)
k=runif(10,5,10)
a=rnorm(10,30,2)
b=运行IF(10,3,5)
c=runif(10,10,20)
d=runif(10,5,10)

标准化列有更好的方法,但我通常会这样做:

set.seed(1234)
x = rnorm(10, 30, .2)
y = runif(10, 3, 5)
z = runif(10, 10, 20)
k = runif(10, 5, 10)
a = rnorm(10, 30, .2)
b = runif(10, 3, 5)
c = runif(10, 10, 20)
d = runif(10, 5, 10)

normalized_columns <- function(x)
{
x/sum(x)
}

dat<-data.frame(x,y,z,k,a,b,c,d)
dat[,c(1,4,6:8)]<-sapply(dat[,c(1,4,6:8)], normalized_columns)
set.seed(1234)
x=rnorm(10,30,2)
y=runif(10,3,5)
z=runif(10,10,20)
k=runif(10,5,10)
a=rnorm(10,30,2)
b=运行IF(10,3,5)
c=runif(10,10,20)
d=runif(10,5,10)

标准化列当OP使用
dplyr
方法时,一个选项是使用
setdiff
mutate\u each

dat %>%
     mutate_each_(funs(scale), setdiff(names(dat), dnot)) 
#               x        y        z           k
#1  -0.8273937 3.633225 14.56091  0.22934964
#2   0.6633811 3.605387 12.65187  0.76742806
#3   1.4738069 3.318092 13.04672 -1.16688369
#4  -1.9708424 3.079992 15.07307  0.62528427
#5   0.8157183 3.437599 11.81096 -1.06313355
#6   0.8929749 4.621197 17.59671 -0.06743894
#7  -0.1923930 4.051395 12.01248  0.94484655
#8  -0.1641660 4.829316 12.58810 -0.16575678
#9  -0.1820615 4.662690 19.92150 -1.55940662
#10 -0.5090247 3.091541 18.07352  1.45571106
或者根据逻辑索引将
名称子集

dat %>%
    mutate_each_(funs(scale), names(dat)[!names(dat) %in% dnot])
#           x        y        z           k
#1  -0.8273937 3.633225 14.56091  0.22934964
#2   0.6633811 3.605387 12.65187  0.76742806
#3   1.4738069 3.318092 13.04672 -1.16688369
#4  -1.9708424 3.079992 15.07307  0.62528427
#5   0.8157183 3.437599 11.81096 -1.06313355
#6   0.8929749 4.621197 17.59671 -0.06743894
#7  -0.1923930 4.051395 12.01248  0.94484655
#8  -0.1641660 4.829316 12.58810 -0.16575678
#9  -0.1820615 4.662690 19.92150 -1.55940662
#10 -0.5090247 3.091541 18.07352  1.45571106
如果我们使用的是
mutate\u each
,另一个选项是
one\u of

dat %>%
     mutate_each(funs(scale), -one_of(dnot))   
#         x        y        z           k
#1  -0.8273937 3.633225 14.56091  0.22934964
#2   0.6633811 3.605387 12.65187  0.76742806
#3   1.4738069 3.318092 13.04672 -1.16688369
#4  -1.9708424 3.079992 15.07307  0.62528427
#5   0.8157183 3.437599 11.81096 -1.06313355
#6   0.8929749 4.621197 17.59671 -0.06743894
#7  -0.1923930 4.051395 12.01248  0.94484655
#8  -0.1641660 4.829316 12.58810 -0.16575678
#9  -0.1820615 4.662690 19.92150 -1.55940662
#10 -0.5090247 3.091541 18.07352  1.45571106

带有
数据的
setdiff
选项。表将是

library(data.table)
nm1 <- setdiff(names(dat), dnot)
setDT(dat)[, (nm1) := lapply(.SD, scale), .SDcols = nm1]
库(data.table)

nm1由于OP使用了
dplyr
方法,一个选项是使用
setdiff
mutate\u each.

dat %>%
     mutate_each_(funs(scale), setdiff(names(dat), dnot)) 
#               x        y        z           k
#1  -0.8273937 3.633225 14.56091  0.22934964
#2   0.6633811 3.605387 12.65187  0.76742806
#3   1.4738069 3.318092 13.04672 -1.16688369
#4  -1.9708424 3.079992 15.07307  0.62528427
#5   0.8157183 3.437599 11.81096 -1.06313355
#6   0.8929749 4.621197 17.59671 -0.06743894
#7  -0.1923930 4.051395 12.01248  0.94484655
#8  -0.1641660 4.829316 12.58810 -0.16575678
#9  -0.1820615 4.662690 19.92150 -1.55940662
#10 -0.5090247 3.091541 18.07352  1.45571106
或者根据逻辑索引将
名称子集

dat %>%
    mutate_each_(funs(scale), names(dat)[!names(dat) %in% dnot])
#           x        y        z           k
#1  -0.8273937 3.633225 14.56091  0.22934964
#2   0.6633811 3.605387 12.65187  0.76742806
#3   1.4738069 3.318092 13.04672 -1.16688369
#4  -1.9708424 3.079992 15.07307  0.62528427
#5   0.8157183 3.437599 11.81096 -1.06313355
#6   0.8929749 4.621197 17.59671 -0.06743894
#7  -0.1923930 4.051395 12.01248  0.94484655
#8  -0.1641660 4.829316 12.58810 -0.16575678
#9  -0.1820615 4.662690 19.92150 -1.55940662
#10 -0.5090247 3.091541 18.07352  1.45571106
如果我们使用的是
mutate\u each
,另一个选项是
one\u of

dat %>%
     mutate_each(funs(scale), -one_of(dnot))   
#         x        y        z           k
#1  -0.8273937 3.633225 14.56091  0.22934964
#2   0.6633811 3.605387 12.65187  0.76742806
#3   1.4738069 3.318092 13.04672 -1.16688369
#4  -1.9708424 3.079992 15.07307  0.62528427
#5   0.8157183 3.437599 11.81096 -1.06313355
#6   0.8929749 4.621197 17.59671 -0.06743894
#7  -0.1923930 4.051395 12.01248  0.94484655
#8  -0.1641660 4.829316 12.58810 -0.16575678
#9  -0.1820615 4.662690 19.92150 -1.55940662
#10 -0.5090247 3.091541 18.07352  1.45571106

带有
数据的
setdiff
选项。表将是

library(data.table)
nm1 <- setdiff(names(dat), dnot)
setDT(dat)[, (nm1) := lapply(.SD, scale), .SDcols = nm1]
库(data.table)
nm1