R 将数据帧转换为比例的有效方法
我有一个数据框df,我想用R除以每个单元格的行和R 将数据帧转换为比例的有效方法,r,R,我有一个数据框df,我想用R除以每个单元格的行和 set.seed(10);a <- sample(c(1:100), 5) set.seed(11);b <- sample(c(1:100), 5) set.seed(12);c <- sample(c(1:100), 5) df <- as.data.frame(rbind(a,b,c)) >df > V1 V2 V3 V4 V5 >a 51 31 42 68 9 >b 28 1 51
set.seed(10);a <- sample(c(1:100), 5)
set.seed(11);b <- sample(c(1:100), 5)
set.seed(12);c <- sample(c(1:100), 5)
df <- as.data.frame(rbind(a,b,c))
>df
> V1 V2 V3 V4 V5
>a 51 31 42 68 9
>b 28 1 51 2 7
>c 7 81 93 27 17
要使用scale
或apply
获得相同的结果,我需要分别键入
as.data.frame(t(scale(t(df), center = FALSE, scale = rowSums(df))))
及
与df/rowSums(df)
相比,这两种方法似乎都有点笨重
我的问题是:scale
、apply
和df/rowSums(df)
之间有什么真正的区别吗?还是这只是个人喜好的问题?也许我没有以最有效的方式使用前两个
使用
df/rowSums(df)
似乎是一个简单而简短的解决方案。有没有什么不明显的问题 您应该使用data.table框架。但我喜欢你的换位法
require(data.table)
setDT(df)
ma_func <- function(df){
df = t(df)
for (col in names(df)){
set(df, NULL, col, df[[col]] / sum(df[[col]]))
}
df = t(df)
}
require(data.table)
setDT(df)
ma_func它们运行速度是否都足够快?如果是这样的话,我会选择最具可读性的。如果df/rowSums(df)对您有效,那么发生的事情就非常清楚了。其他方法需要更多的思考才能弄清楚发生了什么。非常感谢您提供了这一信息丰富的答案和比较。看起来,df/rowSums(df)
始终是这里表现最差的,至少在时间上是这样。我想知道是什么原因导致了马乌函数中4800+的峰值。
t(apply(df, 1, function(i) i/sum(i)))
require(data.table)
setDT(df)
ma_func <- function(df){
df = t(df)
for (col in names(df)){
set(df, NULL, col, df[[col]] / sum(df[[col]]))
}
df = t(df)
}
require(microbenchmark)
microbenchmark(
res1 <- df/rowSums(df),
res2 <- as.data.frame(t(scale(t(df), center = FALSE, scale = rowSums(df)))),
res3 <- t(apply(df, 1, function(i) i/sum(i))),
res4 <- ma_func(df)
)
Unit: microseconds
expr min lq mean median uq max neval
res1 <- df/rowSums(df) 641.908 663.4615 745.1004 706.1280 775.920 1148.631 100
res2 <- as.data.frame(t(scale(t(df), center = FALSE, scale = rowSums(df)))) 185.623 201.4580 230.4596 212.4545 237.820 400.863 100
res3 <- t(apply(df, 1, function(i) i/sum(i))) 102.049 111.7255 145.5423 123.8950 140.170 1589.082 100
res4 <- ma_func(df) 51.611 61.1410 116.7342 65.5405 73.897 4825.307 100