缩放数据行

Pau*_*aul 3 r scale dplyr

我有一个数据框,其中包含行中的客户信息和列中的周期(月)。我将这种格式用于聚类目的。我想缩放行中的值。我可以用下面的代码来做,但是有一些问题:

  1. 对于应该是简单操作的东西来说,代码太复杂了。
  2. 在某些情况下,“scale”函数返回“NaN”。
  3. 输入明确的客户名称 (vars=c("A","B",...) 将不起作用,因为真实数据有数千个客户。

这是我的示例数据和代码:

mydata 
  cust P1  P2 P3  P4 P5  P6 P7  P8 P9 P10 P11 P12 P13 P14 P15 P16 P17 P18 P19 P20
1    A  1 1.0  1 1.0  1 1.0  1 1.0  1 1.0   1 1.0   1 1.0   1 1.0   1 1.0   1 1.0
2    B  5 5.0  5 5.0  5 5.0  5 5.0  5 5.0   5 5.0   5 5.0   5 5.0   5 5.0   5 5.0
3    C  9 9.0  9 9.0  9 9.0  9 9.0  9 9.0   9 9.0   9 9.0   9 9.0   9 9.0   9 9.0
4    D  0 1.0  2 1.0  0 1.0  2 1.0  0 1.0   2 1.0   0 1.0   2 1.0   0 1.0   2 1.0
5    E  4 5.0  6 5.0  4 5.0  6 5.0  4 5.0   6 5.0   4 5.0   6 5.0   4 5.0   6 5.0
6    F  8 9.0 10 9.0  8 9.0 10 9.0  8 9.0  10 9.0   8 9.0  10 9.0   8 9.0  10 9.0
7    G  2 1.5  1 0.5  0 0.5  1 1.5  2 1.5   1 0.5   0 0.5   1 1.5   2 1.5   1 0.5
8    H  6 5.5  5 4.5  4 4.5  5 5.5  6 5.5   5 4.5   4 4.5   5 5.5   6 5.5   5 4.5
9    I 10 9.5  9 8.5  8 8.5  9 9.5 10 9.5   9 8.5   8 8.5   9 9.5  10 9.5   9 8.5
Run Code Online (Sandbox Code Playgroud)

我正在使用的代码:

library(dplyr)
library(tidyr)
# first transpose the data
g_mydata = mydata %>% gather(period,value,-cust)
spr_mydata = g_mydata %>% spread(cust,value)
# then scale the values for each period
sc_mydata = spr_mydata %>% 
      mutate_each_(funs(scale),vars = c("A","B","C","D","E","F","G","H","I") )   
# then transpose again back to original format
g_scdata = sc_mydata %>% gather(cust,value,-period)
scaled_data = g_scdata %>% spread(period,value)
Run Code Online (Sandbox Code Playgroud)

感谢您的任何帮助或建议。

小智 6

你总是可以尝试apply()

sc_mydata = apply(spr_mydata[, -1], 1, scale)
Run Code Online (Sandbox Code Playgroud)

如果NaN's 搞砸了,您可以转置spr_mydata并尝试scale()直接运行:

scale(spr_mydata[-1, ])
Run Code Online (Sandbox Code Playgroud)