Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将数据帧转换为比例的有效方法_R - Fatal编程技术网

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

我有一个数据框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  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