在数据框中更有效地使用临时列(即时创建)
Working with temporary columns (created on-the-fly) more efficiently in a dataframe
考虑以下数据框:
df <- data.frame(replicate(5,sample(1:10, 10, rep=TRUE)))
如果我想将每一行除以其总和(以进行概率分布),我需要这样做:
df %>% mutate(rs = rowSums(.)) %>% mutate_each(funs(. / rs), -rs) %>% select(-rs)
这个真的感觉效率低下:
- 创建一个
rs
列
- 将每个值除以对应的行
rowSums()
- 删除临时创建的列以清理原始数据框。
使用现有列时,感觉更自然:
df %>% summarise_each(funs(weighted.mean(., X1)), -X1)
使用 dplyr
,是否有更好的方法来处理临时列(即时创建)而不是在处理后必须添加和删除它们?
我也对 data.table
如何处理这样的任务很感兴趣。
为什么不考虑基数 R
:
as.data.frame(as.matrix(df)/rowSums(df))
或者只用你的 data.frame
:
df/rowSums(df)
正如我在上面的评论中提到的,我认为将数据保存在 data.frame
或 data.table
中没有意义,但如果必须的话,以下内容可以它没有转换为矩阵,并说明了如何在 data.table
j-expression
:
中创建临时变量
dt = as.data.table(df)
dt[, names(dt) := {sums = Reduce(`+`, .SD); lapply(.SD, '/', sums)}]
考虑以下数据框:
df <- data.frame(replicate(5,sample(1:10, 10, rep=TRUE)))
如果我想将每一行除以其总和(以进行概率分布),我需要这样做:
df %>% mutate(rs = rowSums(.)) %>% mutate_each(funs(. / rs), -rs) %>% select(-rs)
这个真的感觉效率低下:
- 创建一个
rs
列 - 将每个值除以对应的行
rowSums()
- 删除临时创建的列以清理原始数据框。
使用现有列时,感觉更自然:
df %>% summarise_each(funs(weighted.mean(., X1)), -X1)
使用 dplyr
,是否有更好的方法来处理临时列(即时创建)而不是在处理后必须添加和删除它们?
我也对 data.table
如何处理这样的任务很感兴趣。
为什么不考虑基数 R
:
as.data.frame(as.matrix(df)/rowSums(df))
或者只用你的 data.frame
:
df/rowSums(df)
正如我在上面的评论中提到的,我认为将数据保存在 data.frame
或 data.table
中没有意义,但如果必须的话,以下内容可以它没有转换为矩阵,并说明了如何在 data.table
j-expression
:
dt = as.data.table(df)
dt[, names(dt) := {sums = Reduce(`+`, .SD); lapply(.SD, '/', sums)}]