[英]R data.table how to normalize all rows
尝试规范化数据框中的所有行,以便
A B C A B C
1 2 4 => 1 .3 .6
2 2 5 2 .3 .7
3 4 6 3 .4 .6
这将返回一个警告,它正在强制转换为 integer
outdf <- df[, names(df) := (.SD / rowSums(.SD)), .SDcols=x,by=y]
这什么都不做
outdf <- df[, names(df) := as.numeric(x)][,x:=(.SD / rowSums(.SD)), .SDcols=x,by=y][]
这两个很接近。 有没有更好的方法来更改类型或更好的规范化方法。 (数据是 ~42GB 进入这条线所以 data.table 是要走的路)
编辑:
x 和 y
x <- names(data)[14:ncol(data)]
y <- names(data)[1]
我想你可能想多了。 这似乎做了我们想要的:
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
我在分配给 X 以完成预期的替换时没有遇到任何问题。
演示by
.SDcols
和参数不影响这一点。 (并且注意,无论如何,预计不会通过使用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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.