我正在寻找一种方法来创建一个新的列(使用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))