使用 R 过滤列并重复比较成对的两列

2024-04-22

Given a df如下,对于每年的实际值和预测值,我需要检查今年的实际值和预测值与上一年的实际值相比是否具有相同的方向:

df <- structure(list(code = c("M0000273", "M0000357", "M0000545"), 
    name = c("industry", "agriculture", "service"), `2019_actual` = c(16.78, 
    9.26, 49.38), `2019_pred` = c(17.78, 10.26, NA), `2020_actual` = c(35.74, 
    NA, 49.38), `2020_pred` = c(36.74, 66.56, 25.36), `2021_actual` = c(30.74, 
    83.42, 63.26), `2021_pred` = c(31.74, 84.42, 35.23)), class = "data.frame", row.names = c(NA, 
-3L))

Out:

      code        name 2019_actual 2019_pred 2020_actual 2020_pred 2021_actual 2021_pred
1 M0000273    industry       16.78     17.78       35.74     36.74       30.74     31.74
2 M0000357 agriculture        9.26     10.26          NA     66.56       83.42     84.42
3 M0000545     service       49.38        NA       49.38     25.36       63.26     35.23

逻辑是:如果两年的差值为正、负或零,则返回increase, decrease and unchanged分别,如果其中一个或两个值都是NAs,然后返回NA.

预期结果:

     code        name 2019_actual 2019_pred 2020_actual 2020_pred 2021_actual 2021_pred 2020_act_direction 2020_pred_direction 2021_act_direction
1 M0000273    industry       16.78     17.78       35.74     36.74       30.74     31.74           increase            increase           decrease
2 M0000357 agriculture        9.26     10.26          NA     66.56       83.42     84.42                               increase                   
3 M0000545     service       49.38        NA       49.38     25.36       63.26     35.23          unchanged            decrease           increase
  2021_pred_direction
1            decrease
2                    
3            decrease

我尝试使用以下代码,但它有两个问题:1.它返回错误:**Error: unexpected ')' in " )"**; 2.如果我有很多年(即从2010年到2020年),这显然不是获得预期结果的正确方法。

df %>% 
  mutate(
    `2020_act_direction` = case_when(`2020_actual` - `2019_actual` > 0 ~ 'increase',
                                   `2020_actual` - `2019_actual` < 0 ~ 'decrease',
                                   `2020_actual` - `2019_actual` == 0 ~ 'unchanged',
                                   TRUE ~ NA
                                   ),
    `2020_pred_direction` = case_when(`2020_pred` - `2019_actual` > 0 ~ 'increase',
                                   `2020_pred` - `2019_actual` < 0 ~ 'decrease',
                                   `2020_pred` - `2019_actual` == 0 ~ 'unchanged',
                                   TRUE ~ NA
    )
    `2021_act_direction` = case_when(`2021_actual` - `2020_actual` > 0 ~ 'increase',
                                   `2021_actual` - `2020_actual` < 0 ~ 'decrease',
                                   `2021_actual` - `2020_actual` == 0 ~ 'unchanged',
                                   TRUE ~ NA
    )
    `2021_pred_direction` = case_when(`2021_pred` - `2020_actual` > 0 ~ 'increase',
                                   `2021_pred` - `2020_actual` < 0 ~ 'decrease',
                                   `2021_pred` - `2020_actual` == 0 ~ 'unchanged',
                                   TRUE ~ NA
    )
  )

我该如何处理这个问题?


Use pivot_longer and pivot_wider每年获取一行/代码/名称。然后你就可以轻松使用lag连续年份之间进行比较。

library(tidyverse)

df <- structure(list(code = c("M0000273", "M0000357", "M0000545"), 
                     name = c("industry", "agriculture", "service"), 
                     `2019_actual` = c(16.78, 9.26, 49.38), 
                     `2019_pred` = c(17.78, 10.26, NA), 
                     `2020_actual` = c(35.74, NA, 49.38), 
                     `2020_pred` = c(36.74, 66.56, 25.36), 
                     `2021_actual` = c(30.74, 83.42, 63.26), 
                     `2021_pred` = c(31.74, 84.42, 35.23)), 
                class = "data.frame", row.names = c(NA, -3L)) %>% 
    as_tibble()

df %>% 
    pivot_longer(cols = c(-code, -name), names_to = c("year", "type"), names_sep = "_") %>% 
    pivot_wider(names_from = "type", values_from = "value") %>% 
    mutate(year = as.integer(year)) %>% 
    group_by(code, name) %>% 
    arrange(year) %>% 
    mutate(act_direction = case_when(actual > lag(actual) ~ "increase",
                                     actual < lag(actual) ~ "decrease",
                                     actual == lag(actual) ~ "unchanged"),
           pred_direction = case_when(pred > lag(actual) ~ "increase",
                                   pred < lag(actual) ~ "decrease",
                                   pred == lag(actual) ~ "unchanged"))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 R 过滤列并重复比较成对的两列 的相关文章

随机推荐

  • 如何从套接字读取接收自定义数据类型?

    我想接收数据 自定义类型 例如 CMYType 我有以下代码 using namespace boost asio streambuf receivedStreamBuffer streambuf mutable buffers type
  • Conda 将一个环境.yml 导入另一个环境

    考虑将具有依赖项的 Python 子模块导入到具有其自己的依赖项的项目中的情况 假设子模块有它的environment yml文件和项目本身有一个environment yml file 有没有办法创建一个包含这两种环境规范的环境 如果是的
  • 为什么 std::sort 将元素与其自身进行比较

    正如题主所说 为什么下面的代码将某些元素与它们自身进行比较 include
  • Django - 在同一网址中有两个视图

    我正在 django 中制作一个网站 在我的主页中我想显示我最近的博客文章列表 下面的几个块我想制作一个简单的联系表单 博客和联系表格分别运行良好 但我想将它们包含在同一页面中 显然在同一网址中 views py 是 from forms
  • AnkhSVN 和 VisualSVN 可以同时使用吗?

    我想尝试 AnkhSVN 的一项功能 即与 Red Gate SQL Changeset 工具集成 而无需完全卸载 VisualSVN 这感觉很危险 所以我想看看其他人是否有经验可以减轻或证实我的恐惧 Update所以我尝试卸载 Visua
  • Visual Studio 2012 - 条件编译符号设置的位置

    我一生都找不到要在 Visual Studio 2012 中输入项目的条件编译符号的字段 我是这个功能的新手 所以我不知道它是否已被重命名为其他名称 但是我正在努力追随本指南 http www codeproject com Article
  • AWS Step Functions 等待 CodeBuild 完成

    如何等待 CodeBuild 在 Step Functions 状态机内完成 我现在能想到的唯一等待是使用循环和计时器 就像下面的流程一样 但这是唯一的方法吗 没有 WaitForBuild 操作或类似的操作吗 拼写错误 BatchGetB
  • ASP.NET MVC 是否为区域创建默认路由

    我的 MVC 3 应用程序 身份验证 和 用户 中有几个区域 我在用Phil Haacks 路由调试工具 http haacked com archive 2008 03 13 url routing debugger aspx查看我的路线
  • 如果构建是源代码外的,CMake 无法找出标头依赖项?

    我一直在使用 CMake 来管理一个单独的小型 c 项目 基于 Unix Makefile 并决定将其转换为更有组织的源代码外构建 但是 当它超出源时 通过执行cmake 在 build 中 我的标头不再是其源文件的依赖项 如果我只是从顶层
  • 分割车牌字符

    我在从车牌图像中分割字符时遇到问题 我应用了以下方法来提取车牌字符 车牌图像的自适应阈值 选择具有特定纵横比的轮廓 如果车牌图像中有任何阴影 如附件中所示 由于二值化不正确 我无法正确分割字符 图像中的阴影合并图像中的相邻字符 我已经对具有
  • 如何使用release编译一些依赖项

    我想使用 dev 配置文件构建我的 Rust 应用程序 但使用 release 配置文件构建一些依赖项 因为否则它们真的很慢 如何有选择地为我的板条箱依赖项指定配置文件 Cargo 能够覆盖特定包裹的配置文件 来自参考 https doc
  • 仅过滤有错误的请求 - Google Chrome 网络

    如何在 google chrome 网络开发工具中仅过滤有错误的请求 我找到了自己的方法 所以它不是官方的 可能存在其他方法 选项 1 过滤 HTTP 状态代码 您可以按状态代码过滤响应 这是一个有用的列表 https httpstatus
  • 使用 java swing 显示两个重叠的对话框

    我遇到一种情况 我显示一个对话框 用户必须填写一些菜单 然后按 确定 它工作正常 但现在我在这个对话框上有另一个按钮 如果用户想要添加一些特定的值 我希望弹出另一个对话框 用户在其中填写附加值 然后按 确定 该对话框消失 用户返回主窗口对话
  • 用 ruby​​ 制作闪烁的控制台消息

    0 upto 9 do STDOUT print Flash sleep 0 5 STDOUT print b b b b b b 6 backspaces the length of Flash sleep 0 5 end 这段代码不起作
  • 错误:[电子邮件受保护]:未知版本:mountain_lion

    关注了这个tutorial https github com thoughtbot capybara webkit wiki Installing Qt and compiling capybara webkit macos high si
  • 通过 URL HeadlessChrome 进行 Selenium 基本身份验证(在 Linux 服务器上)

    在我的 Selenium 测试中 我需要测试一个使用基本 Authen 的网页 知道我正在使用 Chrome Headless Java 和 Selenium WebDriver 在我的 本地 机器上它可以完美地使用driver get h
  • 如何在 mac os x 上安装 Image::Magick?

    我尝试用brew安装 brew install imagemagick 安装似乎已成功完成 然而 当尝试 use Image Magick 我收到以下错误消息 Can t locate Image Magick pm in INC 我不太了
  • 透明颜色 Tkinter

    是否可以将框架背景或任何其他小部件的颜色更改为透明浅蓝色或任何其他透明颜色 是的 有办法 不幸的是 它仅适用于整个窗口 窗口和所有子窗口小部件 这是我不久前写的一个小演示 除其他外 它可以满足您的需求 透明窗口演示 import Tkint
  • 将枚举类型转换为整数,反之亦然[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个枚举 enum MYENUM VAL 1 0 VAL 2 VAL 3 以及两个分别以整数和枚举作为参数的函数 void MyInt
  • 使用 R 过滤列并重复比较成对的两列

    Given a df如下 对于每年的实际值和预测值 我需要检查今年的实际值和预测值与上一年的实际值相比是否具有相同的方向 df lt structure list code c M0000273 M0000357 M0000545 name