r - R中函数内的dplyr过滤器问题
问题描述
我有以下数据集:
dat<-structure(list(X1979 = c(1.26884, 0.75802, 0.35127, -0.0679517,
-4.34841, -0.312289, -5.02931, -2.49339, -12.9065, -2.90853,
-1.02833, 0.333109, 1.70236, -2.44456, -1.83307, -0.982637, -2.14197,
-4.1294, -3.98545, -6.26205, -5.56162, 0.0789091, 1.63146, -0.214938
), X1980 = c(-1.32651, -0.0199441, -1.08583, 3.25939, 0.0402712,
-3.22174, -0.859756, -3.30898, 1.0128, 0.847161, 2.75866, 1.93117,
1.05851, 1.83372, -0.811736, -0.992584, -0.110012, 0.132343,
2.21745, -1.48902, 0.111302, -3.77058, -3.65044, -2.41263)), class =
"data.frame", row.names = 50:73)
我想在上述数据中的每列应用以下函数:
library(dplyr)
library(tibble)
library(zoo)
test <- function(x){
dat %>%
rownames_to_column() %>%
filter(V1 > 0 &
rollsum(V1 > 0, 4, fill = NA, align =
"left") >= 3 &
rollsum(V1, 4, fill = NA, align =
"left") > 1) %>%
return(slice(1))
}
test(dat)
我遇到了一个错误,说在数据中找不到 V1。所以我的问题是如何更正此函数,以便它可以读取列中的值而不管标题名称如何?
我会很感激这方面的任何帮助。
解决方案
您需要使用整洁的评估。更多信息在这里:
library(zoo)
library(rlang)
library(tidyverse)
dat <- structure(list(X1979 = c(1.26884, 0.75802, 0.35127, -0.0679517,
-4.34841, -0.312289, -5.02931, -2.49339, -12.9065, -2.90853,
-1.02833, 0.333109, 1.70236, -2.44456, -1.83307, -0.982637, -2.14197,
-4.1294, -3.98545, -6.26205, -5.56162, 0.0789091, 1.63146, -0.214938
), X1980 = c(-1.32651, -0.0199441, -1.08583, 3.25939, 0.0402712,
-3.22174, -0.859756, -3.30898, 1.0128, 0.847161, 2.75866, 1.93117,
1.05851, 1.83372, -0.811736, -0.992584, -0.110012, 0.132343,
2.21745, -1.48902, 0.111302, -3.77058, -3.65044, -2.41263)), class =
"data.frame", row.names = 50:73)
使用卷曲{{}}
test <- function(dat, column_name){
dat %>%
rownames_to_column() %>%
filter({{column_name}} > 0 &
rollsum({{column_name}} > 0, 4, fill = NA, align =
"left") >= 3 &
rollsum({{column_name}}, 4, fill = NA, align =
"left") > 1) %>%
slice(1) -> result
return(result)
}
test(dat, X1979)
#> rowname X1979 X1980
#> 1 50 1.2688 -1.3265
使用.data[[]]
代词
test2 <- function(dat, column_name){
dat %>%
rownames_to_column() %>%
filter(.data[[column_name]] > 0 &
rollsum(.data[[column_name]] > 0, 4, fill = NA, align =
"left") >= 3 &
rollsum(.data[[column_name]], 4, fill = NA, align =
"left") > 1) %>%
slice(1) -> result
return(result)
}
out <- colnames(dat) %>%
set_names %>%
map_dfr(~ test2(dat, .x), .id = 'Col_ID')
out
#> Col_ID rowname X1979 X1980
#> 1 X1979 50 1.2688 -1.3265
#> 2 X1980 58 -12.9065 1.0128
由reprex 包(v0.3.0)于 2020 年 5 月 5 日创建
推荐阅读
- php - Laravel 错误“找不到类 'App\Http\Controllers\DateTime'”
- opc - OPC UA 地址空间的建模
- python - APScheduler 上的打印时间
- node.js - 如何使用 Nock、Node js 在单元测试中模拟一行
- angular - PrimeNG - 通过按钮单击发送表单数据和文件上传数据
- c# - 拖动时更改 ZIndex
- java - 如何在下面程序中的文本视图中显示 GetCountryZipCode()?
- css - 使用 React 时右对齐表格单元格
- python - 将来自 SQL 的列表与从 API 中提取的列表进行比较
- sql - 如何提取日期并使用 +/- 30 天来检查参数