R data.table如何标准化所有行

tja*_*787 -2 r normalization data.table

尝试标准化数据框中的所有行,以便

A B C      A   B   C
1 2 4 =>   1  .3  .6
2 2 5      2  .3  .7
3 4 6      3  .4  .6
Run Code Online (Sandbox Code Playgroud)

会返回一个警告,表明它正在强制转换为整数

outdf <- df[, names(df) := (.SD / rowSums(.SD)), .SDcols=x,by=y]
Run Code Online (Sandbox Code Playgroud)

没有任何作用

outdf <- df[, names(df) := as.numeric(x)][,x:=(.SD / rowSums(.SD)), .SDcols=x,by=y][]
Run Code Online (Sandbox Code Playgroud)

这些都很接近。有没有更好的方法来改变类型或者更好的方法来规范化。(进入这一行的数据约为 42GB,因此 data.table 是正确的选择)

编辑:

x 和 y

x <- names(data)[14:ncol(data)]
y <- names(data)[1]
Run Code Online (Sandbox Code Playgroud)

42-*_*42- 5

我想你可能想多了。这似乎达到了预期的效果:

library(data.table)
X <- data.table(A=c(1,2,2), B=c(2,2,4))
X[ , .SD/rowSums(.SD)]  
# using .SDcols can be used to make this selective
           A         B
1: 0.3333333 0.6666667
2: 0.5000000 0.5000000
3: 0.3333333 0.6666667
Run Code Online (Sandbox Code Playgroud)

我在分配给 X 来完成预期的替换时没有遇到任何问题。

演示使用.SDcolsby参数不会影响这一点。(并注意,无论如何,使用参数不会影响面向行的操作by。)

X <- data.table(ID =letters[1:3], A=c(1,2,2), B=c(2,2,4))
X <- rbind(X,X)  # so there are multiple items in the groups
X <- X[ , .SD/rowSums(.SD), .SDcols=c("A", "B"), by="ID"]
# Only effect of the `by="ID"` seem to be an alpha sort

> X
   ID         A         B
1:  a 0.3333333 0.6666667
2:  a 0.3333333 0.6666667
3:  b 0.5000000 0.5000000
4:  b 0.5000000 0.5000000
5:  c 0.3333333 0.6666667
6:  c 0.3333333 0.6666667
Run Code Online (Sandbox Code Playgroud)