有选择地缩放 R 中的变量

  • 本文关键字:变量 选择地 缩放 r
  • 更新时间 :
  • 英文 :


假设您有以下名为data的数据帧:

Country V1 V2
US      1  2
US      2  1
US      3  1
UK      1  1
UK      2  1
UK      3  3
...
IT      2  2

现在我想缩放变量V1V2。第一个想法是使用类似的东西:

data %>%
mutate_at(.vars = c("V1", "V2"), .funs = scale)

但是,如果我想对Country变量的每个值单独执行缩放并将结果全部放在一个数据帧中,该怎么办?

这只是一个例子,我无法提供的实际数据包含很多NA。我担心如果我使用select或其他一些函数,由于 NA,数据将无法正确连接回来。

如果我们想将 data.frame/tibble 作为单独的,那么一个选项是map并将其存储在list

library(dplyr)
map(c("V1", "V2"), ~ data %>%
select(Country, .x) %>%
group_by(Country)
scale)

或者,如果我们需要做一个group_by

data %>%
group_by(Country) %>%
mutate_at(vars(V1, V2), ~ c(scale(.)))

这是带有base R的解决方案(给定数据框df如帖子中所示(

res <- (r<-Reduce(rbind,lapply(split(df,df$Country), function(x) {x[-1]<-scale(x[-1]);x})))[order(as.numeric(rownames(r))),]

这样

> res
Country  V1         V2
1      US  -1  1.1547005
2      US   0 -0.5773503
3      US   1 -0.5773503
4      UK  -1 -0.5773503
5      UK   0 -0.5773503
6      UK   1  1.1547005
7      IT NaN        NaN

数据

df <- structure(list(Country = structure(c(3L, 3L, 3L, 2L, 2L, 2L, 
1L), .Label = c("IT", "UK", "US"), class = "factor"), V1 = c(1L, 
2L, 3L, 1L, 2L, 3L, 2L), V2 = c(2L, 1L, 1L, 1L, 1L, 3L, 2L)), class = "data.frame", row.names = c(NA, 
-7L))

最新更新