【问题标题】:Add scale column to data frame by factor按因子将比例列添加到数据框
【发布时间】:2013-10-13 22:19:33
【问题描述】:

我正在尝试将一列添加到由一个因子归一化的值组成的数据框中。

例如:

'data.frame':   261 obs. of  3 variables:
 $ Area   : Factor w/ 29 levels "Antrim","Ards",..: 1 1 1 1 1 1 1 1 1 2 ...
 $ Year   : Factor w/ 9 levels "2002","2003",..: 1 2 3 4 5 6 7 8 9 1 ...
 $ Arrests: int  18 54 47 70 62 85 96 123 99 38 ... 

我想添加一列,它是按区域分组归一化的 Arrests 值。

我想到的最好的是:

data$Arrests.norm <- unlist(unname(by(data$Arrests,data$Area,function(x){ scale(x)[,1] } )))

此命令处理但数据被打乱,即标准化值与数据帧中的正确区域不匹配。

感谢您的提示。

编辑:只是为了澄清我所说的加扰数据的意思,在我的代码之后对数据框进行子集化,我得到如下输出,其中标准化值显然属于另一个因素组。

      Area Year Arrests Arrests.norm
199 Larne 2002      92 -0.992843957
200 Larne 2003     124 -0.404975825
201 Larne 2004      89 -1.169204397
202 Larne 2005      94 -0.581336264
203 Larne 2006      98 -0.228615385
204 Larne 2007       8  0.006531868
205 Larne 2008      31  0.418039561
206 Larne 2009      25  0.947120880
207 Larne 2010      22  2.005283518

【问题讨论】:

    标签: r


    【解决方案1】:

    跟进您的by 尝试:

    df <- data.frame(A = factor(rep(c("a", "b"), each = 4)),
                     B = sample(1:4, 8, TRUE))
    
    ll <- by(data = df, df$A, function(x){
      x$B_scale <- scale(x$B)
      x
      }
       )
    
    df2 <- do.call(rbind, ll)
    

    【讨论】:

    • df2 是双矩阵吗?当我将它分配给数据框时,与我的编辑相同的不匹配适用..
    • 不,df2 对应于您的最终数据框。无需“分配”它。运行str(df2)。因为你没有提供minimal, reproducible data set,所以我做了一个小例子。
    • 对,函数中漏掉了一个任性的“x”。非常感谢。
    【解决方案2】:
    data <- transform(data, Arrests.norm = ave(Arrests, Area, FUN = scale))
    

    会成功的。

    【讨论】:

    • 这产生了同样的问题,即数据是混合的。例如subset(data,data$Area =="Larne") 产生不匹配的数据,例如Newtownabbey1 Larne 2002 92 -0.992843957
    • @JonMac 对,我修改了答案。现在,顺序是正确的。
    猜你喜欢
    • 2016-11-29
    • 1970-01-01
    • 2017-09-02
    • 2015-09-04
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    相关资源
    最近更新 更多