在过滤的每个步骤打印数据框尺寸
Print data frame dimensions at each step of filtering
我正在使用 tidyverse 过滤数据框,并希望在中间对象的维度(或 nrows)的每一步打印。
我以为我可以简单地使用 magrittr 的三通管操作员,但它不起作用。
我想我了解 T 形管背后的概念,但无法弄清楚哪里出了问题。我进行了广泛的搜索,但没有找到太多关于三通管的资源。
我用 mtcars 数据集构建了一个简单的示例。打印中间对象有效,但如果我用 dim() 或 nrow() 替换则无效。
library(tidyverse)
library(magrittr)
mtcars %>%
filter(cyl > 4) %T>% dim() %>%
filter(am == 0) %T>% dim() %>%
filter(disp >= 200) %>% dim()
我当然可以用 R base 编写,但我想坚持 tidyverse 精神。我可能忽略了一些关于 T 形管概念的东西,任何 comments/solutions 将不胜感激。
编辑:
在@hrbrmstr 和@akrun 快速而漂亮的回答之后,我再次尝试在不编写函数的情况下坚持使用 T 型管道运算符。我不知道为什么我自己没有早点找到答案,但这是我正在寻找的语法:
mtcars %>%
filter(cyl > 4) %T>% {print(dim(.))} %>%
filter(am == 0) %T>% {print(dim(.))} %>%
filter(disp >= 200) %>% {print(dim(.))}
尽管需要一个函数,@hrbrmstr 解决方案确实更容易"clean up"。
我们可以在 {}
中使用 print
mtcars %>%
filter(cyl > 4) %>%
{print(dim(.))
filter(., am == 0) } %>%
{print(dim(.))
filter(., disp >= 200)} %>%
{print(dim(.))
.}
#[1] 21 11
#[1] 16 11
#[1] 14 11
# mpg cyl disp hp drat wt qsec vs am gear carb
#1 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
#2 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
#3 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
#4 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
#5 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
#6 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
#7 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
#8 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
#9 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
#10 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
#11 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
#12 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
#13 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
#14 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
@akrun 的想法可行,但它不是惯用的 tidyverse。 tidyverse
中的其他函数,如 print()
和 glimpse()
return 数据参数是不可见的,因此它们可以在不诉诸 {}
的情况下通过管道传输。这些 {}
让您在探索完正在发生的事情后很难清理管道。
尝试:
library(tidyverse)
tidydim <- function(x) {
print(dim(x))
invisible(x)
}
mtcars %>%
filter(cyl > 4) %>%
tidydim() %>%
filter(., am == 0) %>%
tidydim() %>%
filter(., disp >= 200) %>%
tidydim()
这样你的"cleanup"(即不产生临时控制台输出)可以quickly/easily删除tidydim()
行或删除print(…)
来自函数。
库 magrittr
中的管道 %T>%
就是为这种情况创建的:
library(magrittr)
library(dplyr)
mtcars %>%
filter(cyl > 4) %T>% {print(dim(.))} %>%
filter(am == 0) %T>% {print(dim(.))} %>%
filter(disp >= 200) %T>% {print(dim(.))}
使用 alt + selection
在 Rstudio
中阅读和编辑非常容易,如果你和我一样。
如果你不喜欢括号,也可以在这里使用@hrbrmstr 的函数,除非你不需要最后一行。
几个月后重温这里有一个概括@hrbmst 解决方案的想法,因此您可以打印几乎所有您想要的内容和return 管道进行的输入。
library(tidyverse)
pprint <- function(.data,.fun,...){
.fun <- purrr::as_mapper(.fun)
print(.fun(.data,...))
invisible(.data)
}
iris %>%
pprint(~"hello") %>%
head(2) %>%
select(-Species) %>%
pprint(rowSums,na.rm=TRUE) %>%
pprint(~rename_all(.[1:2],toupper)) %>%
pprint(dim)
# [1] "hello"
# 1 2
# 10.2 9.5
# SEPAL.LENGTH SEPAL.WIDTH
# 1 5.1 3.5
# 2 4.9 3.0
# [1] 2 4
我正在使用 tidyverse 过滤数据框,并希望在中间对象的维度(或 nrows)的每一步打印。 我以为我可以简单地使用 magrittr 的三通管操作员,但它不起作用。 我想我了解 T 形管背后的概念,但无法弄清楚哪里出了问题。我进行了广泛的搜索,但没有找到太多关于三通管的资源。
我用 mtcars 数据集构建了一个简单的示例。打印中间对象有效,但如果我用 dim() 或 nrow() 替换则无效。
library(tidyverse)
library(magrittr)
mtcars %>%
filter(cyl > 4) %T>% dim() %>%
filter(am == 0) %T>% dim() %>%
filter(disp >= 200) %>% dim()
我当然可以用 R base 编写,但我想坚持 tidyverse 精神。我可能忽略了一些关于 T 形管概念的东西,任何 comments/solutions 将不胜感激。
编辑: 在@hrbrmstr 和@akrun 快速而漂亮的回答之后,我再次尝试在不编写函数的情况下坚持使用 T 型管道运算符。我不知道为什么我自己没有早点找到答案,但这是我正在寻找的语法:
mtcars %>%
filter(cyl > 4) %T>% {print(dim(.))} %>%
filter(am == 0) %T>% {print(dim(.))} %>%
filter(disp >= 200) %>% {print(dim(.))}
尽管需要一个函数,@hrbrmstr 解决方案确实更容易"clean up"。
我们可以在 {}
print
mtcars %>%
filter(cyl > 4) %>%
{print(dim(.))
filter(., am == 0) } %>%
{print(dim(.))
filter(., disp >= 200)} %>%
{print(dim(.))
.}
#[1] 21 11
#[1] 16 11
#[1] 14 11
# mpg cyl disp hp drat wt qsec vs am gear carb
#1 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
#2 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
#3 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
#4 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
#5 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
#6 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
#7 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
#8 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
#9 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
#10 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
#11 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
#12 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
#13 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
#14 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
@akrun 的想法可行,但它不是惯用的 tidyverse。 tidyverse
中的其他函数,如 print()
和 glimpse()
return 数据参数是不可见的,因此它们可以在不诉诸 {}
的情况下通过管道传输。这些 {}
让您在探索完正在发生的事情后很难清理管道。
尝试:
library(tidyverse)
tidydim <- function(x) {
print(dim(x))
invisible(x)
}
mtcars %>%
filter(cyl > 4) %>%
tidydim() %>%
filter(., am == 0) %>%
tidydim() %>%
filter(., disp >= 200) %>%
tidydim()
这样你的"cleanup"(即不产生临时控制台输出)可以quickly/easily删除tidydim()
行或删除print(…)
来自函数。
库 magrittr
中的管道 %T>%
就是为这种情况创建的:
library(magrittr)
library(dplyr)
mtcars %>%
filter(cyl > 4) %T>% {print(dim(.))} %>%
filter(am == 0) %T>% {print(dim(.))} %>%
filter(disp >= 200) %T>% {print(dim(.))}
使用 alt + selection
在 Rstudio
中阅读和编辑非常容易,如果你和我一样。
如果你不喜欢括号,也可以在这里使用@hrbrmstr 的函数,除非你不需要最后一行。
几个月后重温这里有一个概括@hrbmst 解决方案的想法,因此您可以打印几乎所有您想要的内容和return 管道进行的输入。
library(tidyverse)
pprint <- function(.data,.fun,...){
.fun <- purrr::as_mapper(.fun)
print(.fun(.data,...))
invisible(.data)
}
iris %>%
pprint(~"hello") %>%
head(2) %>%
select(-Species) %>%
pprint(rowSums,na.rm=TRUE) %>%
pprint(~rename_all(.[1:2],toupper)) %>%
pprint(dim)
# [1] "hello"
# 1 2
# 10.2 9.5
# SEPAL.LENGTH SEPAL.WIDTH
# 1 5.1 3.5
# 2 4.9 3.0
# [1] 2 4