在数据帧中更有效地使用临时列(在运行中创建)

时间:2015-02-03 23:01:23

标签: r data.table dplyr

考虑以下数据框:

df <- data.frame(replicate(5,sample(1:10, 10, rep=TRUE)))

如果我想将每一行除以其总和(以进行概率分布),我需要做这样的事情:

df %>% mutate(rs = rowSums(.)) %>% mutate_each(funs(. / rs), -rs) %>% select(-rs)

真的感觉效率低下:

  1. 创建rs
  2. 将每个值除以相应的行rowSums()
  3. 删除临时创建的列以清理原始数据帧。
  4. 使用现有列时,感觉更自然:

    df %>% summarise_each(funs(weighted.mean(., X1)), -X1)

    使用dplyr,是否有更好的方法来处理临时列(即时创建),而不是在处理后添加和删除它们?

    我也对data.table如何处理这样的任务感兴趣。

2 个答案:

答案 0 :(得分:3)

正如我在上面的评论中所提到的,我认为将这些数据保存在data.framedata.table中是不合理的,但如果必须,以下内容将在没有转换为矩阵并说明如何在data.table j-expression中创建临时变量:

dt = as.data.table(df)

dt[, names(dt) := {sums = Reduce(`+`, .SD); lapply(.SD, '/', sums)}]

答案 1 :(得分:1)

为什么不考虑基础R

as.data.frame(as.matrix(df)/rowSums(df))

或者只是使用data.frame

df/rowSums(df)