tidytable代码
library(tidytable)
library(collapse)
Out1 <-
wlddev %>%
mutate_rowwise.(New1 = sum(c_across.(PCGDP:GINI), na.rm = TRUE))
Out1 %>%
select.(New1)
# A tidytable: 13,176 x 1
New1
<dbl>
1 32.4
2 33.0
3 33.5
4 34.0
5 34.5
6 34.9
7 35.4
8 35.9
9 36.4
10 36.9
# ... with 13,166 more rows折叠码
library(collapse)
Out2 <-
wlddev %>%
ftransform(New1 = fsum(across(PCGDP:GINI), na.rm = TRUE))
Error in `context_peek()`:
! `across()` must only be used inside dplyr verbs.
Run `rlang::last_error()` to see where the error occurred.请给我任何提示。
发布于 2022-02-03 19:02:12
来自?fsum的collapse按列求和
fsum是一个泛型函数,它计算x中所有值的(按列排列的)和,(可选)按g和/或按w加权(例如,计算调查总数)。
基于tidytable代码,它是rowwise,因此一个选项是选择(slt)感兴趣的列transpose,转换为tibble/data.frame并使用fsum并创建一个新的列。
library(collapse)
Out2 <- wlddev %>%
slt(PCGDP:GINI) %>%
t %>%
as_tibble %>%
fsum(.) %>%
ftransform(wlddev, New1 = .) 当所有元素都是sum时,NA返回0,而fsum默认使用na.rm = TRUE,如果所有元素都是NA,则返回NA。
> fsum(c(NA, NA))
[1] NA
> sum(c(NA, NA), na.rm = TRUE)
[1] 0因此,如果我们将第二个数据中的NA更改为0,输出将与OP的“Out1”相同
> Out2$New1[is.na(Out2$New1)] <- 0
> all.equal(Out1, Out2, check.attributes = FALSE)
[1] TRUE发布于 2022-02-04 19:45:12
在@akrun答案的领导下,我想出了一个速度更快的解决方案。
Out3 <-
wlddev %>%
slt(PCGDP:GINI) %>%
qDT() %>%
t %>%
fsum(.) %>%
ftransform(.data = wlddev, New1 = .) %>%
qDT() %>%
replace_NA(X = ., value = 0, cols = "New1")速度比较
library(microbenchmark)
microbenchmark(
Out1 =
wlddev %>%
mutate_rowwise.(New1 = sum(c_across.(PCGDP:GINI), na.rm = TRUE))
, Out2 =
wlddev %>%
slt(PCGDP:GINI) %>%
t %>%
as_tibble %>%
fsum(.) %>%
ftransform(wlddev, New1 = .)
, Out3 =
wlddev %>%
slt(PCGDP:GINI) %>%
qDT() %>%
t %>%
fsum(.) %>%
ftransform(.data = wlddev, New1 = .) %>%
qDT() %>%
replace_NA(X = ., value = 0, cols = "New1")
)
Unit: microseconds
expr min lq mean median uq max neval
Out1 72618.0 78268.75 81296.992 79888.50 81671.10 162397.8 100
Out2 33549.7 35520.75 37763.537 37728.25 39021.90 55001.3 100
Out3 241.2 310.85 360.225 357.40 387.35 780.1 100https://stackoverflow.com/questions/70976752
复制相似问题