【问题标题】:Efficient way of scaling column based on value in other column in R dataframe基于R数据框中其他列中的值缩放列的有效方法
【发布时间】:2016-07-21 03:34:12
【问题描述】:

我想根据另一列中的值缩放dataframe 列中的值。例如,这里是一个简单的例子

d<-data.frame(x=runif(5,0,10),y=sample(c(1,2),size=5,replace=TRUE))

给出输出:

         x  y
1 1.0895865 2
2 0.8261554 2
3 5.3503761 2
4 3.3940759 1
5 6.2786637 1

我想根据 y 值缩放 x 值,所以我想要的是:

(x|y=1 - average(x's | y=1))/std.dev(x's|y=1)

然后将 d 中的 x 值替换为缩放后的值,类似地,x 值替换为 y=2

到目前为止我所做的有点笨拙:

     d1<-subset(d,y==1)
d2<-subset(d,y==2)

d1$x<-(d1$x-mean(d1$x))/sd(d1$x)
d2$x<-(d2$x-mean(d2$x))/sd(d2$x)

然后将所有结果绑定到一个大数据框中,但这有点乏味,因为我的实际数据有 50 个不同的 y 值,我想对多个(不同的)列执行此操作。

【问题讨论】:

  • 请将set.seed() 添加到您的代码中,以使其可重现并共享预期的输出。
  • 也许你正在寻找ave(d$x,d$y,FUN=function(x) (x-mean(x))/sd(x))

标签: r dataframe scale


【解决方案1】:

您可以使用dplyr 包中的group_bymutate 轻松完成此操作:

require(dplyr)
d %>% 
  group_by(y) %>% 
  mutate(x = (x - mean(x)) / sd(x))

【讨论】:

  • 你能解释一下'%>%'为什么格式与普通函数如此不同吗?顺便说一句,这很好用!
  • %&gt;% 是来自magrittr 的链接运算符。将多个函数链接在一起时,它更容易、更易读。如果你写上面的代码没有%&gt;%,它变成mutate(group_by(d, y), x = (x - mean(x)) / sd(x))。基本上不用写f(x, y),你可以写x %&gt;% f(y)。另请查看here 了解更多信息。
【解决方案2】:

此任务通常由group bydplyr 中使用scale 执行

 library(dplyr)
 d %>% group_by(y) %>% mutate(x2=scale(x))

【讨论】:

    【解决方案3】:

    我们可以使用data.table。我们将“data.frame”转换为“data.table”(setDT(d)),按“b”分组,将“x”的scale:=)分配给“x2”。

     setDT(d)[, x2 := scale(x) , by = y]
    

    【讨论】:

    • 这并没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
    • @AlessandroCuttin 添加了描述。
    猜你喜欢
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多