r语言 - 如何根据应用于整个管道数据帧的条件创建新列(使用 dplyr 的突变)



我正在寻找一种方法来创建一个新的列(使用dplyr的mutate(,基于特定的"条件";。

library(tidyverse)
qq <- 5
df <- data.frame(rn = 1:qq,
a = rnorm(qq,0,1),
b = rnorm(qq,10,5))
myf <- function(dataframe,value){
result <- dataframe %>% 
filter(rn<=value) %>% 
nrow
return(result)
}

上面的例子是一个相当简化的版本,我试图过滤管道数据帧(df(并获得一个新列(foo(,其值将描述有多少行的rn小于或等于当前rn(每行的rn来自管道df(。下面你可以看到我得到的输出与我期望得到的输出:

df %>% 
mutate(
foo_i_am_getting = myf(.,rn),
foo_expected = 1:qq)
rn          a         b foo_i_am_getting foo_expected
1  1 -0.5403937 -4.945643                5            1
2  2  0.7169147  2.516924                5            2
3  3 -0.2610024 -7.003944                5            3
4  4 -0.9991419 -1.663043                5            4
5  5  1.4002610 15.501411                5            5

我试图执行的实际计算更麻烦,然而,如果我解决了上面的简化版本,我相信我可以在自定义函数中处理其余的操作/计算。

额外问题:当前,我要应用筛选器的列的名称(即rn(在自定义函数中进行硬编码(筛选器(rn<=value((。如果这是自定义函数的一个参数,并以"tidyverse"样式传递,即不带引号的,例如myf<-,那就太好了函数(数据帧、rn、值(

免责声明:我已经尽我所能描述了手头的问题,但是,如果还有不清楚的地方,请告诉我,这样我可以进一步详细说明。

提前感谢您的支持!

您需要一步一步地进行,因为现在您要将整个向量传递给过滤器,而不是每次只传递一个值:

df %>% 
mutate(
foo_i_am_getting = map_dbl(.$rn, function(x) nrow(filter(., rn <= x))),
foo_expected = 1:qq)

现在我们传递1来过滤rn列(函数返回行数(,然后传递2来过滤rn栏。

功能可以是:

myf <- function(vec_filter, dataframe, vec_rn) {
map_dbl(vec_filter, ~ nrow(filter(dataframe, {{vec_rn}} <= .x)))
}
df %>% 
mutate(
foo_i_am_getting = map_dbl(.$rn, function(x) nrow(filter(., rn <= x))),
foo_expected = 1:qq,
foo_function = myf(rn, ., rn))

最新更新