假设您有以下名为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
现在我想缩放变量V1
和V2
。第一个想法是使用类似的东西:
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))