Tyl*_*ker 7 r dplyr data.table
为某些列应用函数的dplyr方法是什么?rowwise例如,我想抓取所有V,列并根据行总和将它们转换为百分比.我展示了如何在基地做到这一点.在dplyr链中怎么样?很高兴看到data.table形式(虽然偏好将在这里转到dplyr解决方案).
x <- data.frame(A=LETTERS[1:5], as.data.frame(matrix(sample(0:5, 25, T), ncol=5)))
data.frame(x[1], x[-1]/rowSums(x[-1]))
## A V1 V2 V3 V4 V5
## 1 A 0.1428571 0.2142857 0.2142857 0.35714286 0.07142857
## 2 B 0.2000000 0.2000000 0.1500000 0.20000000 0.25000000
## 3 C 0.3571429 0.2857143 0.0000000 0.07142857 0.28571429
## 4 D 0.1904762 0.2380952 0.1904762 0.23809524 0.14285714
## 5 E 0.2000000 0.2500000 0.1500000 0.25000000 0.15000000
library(dplyr)
props <- function(x) round(x/sum(x), 2)
# does not work
x %>%
rowwise()
mutate(props(matches("^.{2}$")))
Run Code Online (Sandbox Code Playgroud)
在data.table中,你可以做到
library(data.table)
setDT(x)
x[, grep("^V",names(DT)) := .SD/Reduce(`+`, .SD), .SDcols = V1:V5]
A V1 V2 V3 V4 V5
1: A 0.28571429 0.0000000 0.2857143 0.07142857 0.35714286
2: B 0.23076923 0.2307692 0.3076923 0.15384615 0.07692308
3: C 0.44444444 0.0000000 0.4444444 0.00000000 0.11111111
4: D 0.07142857 0.3571429 0.1428571 0.07142857 0.35714286
5: E 0.00000000 0.2222222 0.3333333 0.44444444 0.00000000
Run Code Online (Sandbox Code Playgroud)
为了计算忽略NA值的分母,我猜rowSums是一个选项,尽管它会强制.SD作为中间步骤的矩阵.
您可以结合tidyr的spread,并gather与dplyr得到以下单管道:
x <- data.frame(A=LETTERS[1:5], as.data.frame(matrix(sample(0:5, 25, T), ncol=5)))
y <- x %>%
gather(V, val, -A) %>%
group_by(A) %>%
mutate(perc = val / sum(val)) %>%
select(-val) %>%
spread(V, perc)
Run Code Online (Sandbox Code Playgroud)
通过整洁的数据,可以很容易地获得任何分组总和(行,列或任何嵌套的索引级别)并计算百分比.在spread和gather将让你从你的输入数据格式.
| 归档时间: |
|
| 查看次数: |
1227 次 |
| 最近记录: |