r - 在 r 中添加基于相同列和其他两列的计算列
问题描述
我正在尝试添加基于相同值的计算列和根据第三列中的值计算的另一列。共有三列,year、id和value。如果2011 的id与 2005 的id匹配,则从 2011 的值中减去2005 的值。因此差异显示 10-11=-1、20-5=15 和 30-16=14...其余行可以是 0 或 NA,没关系。下表显示了带有新差异列的结果表。
我知道我可以将数据拆分为两个表,然后如果两个表按年份和 ID 排序相同,则通过简单的减法创建列,但这不是这个特定问题的选项。尝试考虑如何使用 case_when 或 ifelse ,但它令人费解,无法理解它。我发现了一些示例,但它们没有解决这个问题-它们主要基于仅使用两列或三列之间的比较……但是,其中一个值来自同一列。我该如何解决这个问题?
非常感谢您的帮助。
这是原始表的代码:
dat <- data.frame(year=c(2011,2011,2011,2005,2005,2005),
id=c(1,2,3,1,2,3),
value=c(10,20,30,11,5,6))
解决方案
对于您对 Ronak 的回答的评论中有多个 id 的情况,您可以执行以下操作:
library(tidyr)
library(dplyr)
dat2 |>
pivot_wider(id, values_from = value, names_from = year) |>
unnest(c(`2011`, `2005`)) |>
mutate(difference = `2011` - `2005`) |>
pivot_longer(c(`2011`, `2005`), names_to = "year")
# A tibble: 10 x 4
id difference year value
<dbl> <dbl> <chr> <dbl>
1 1 -1 2011 10
2 1 -1 2005 11
3 1 -1 2011 10
4 1 -1 2005 11
5 2 15 2011 20
6 2 15 2005 5
7 2 15 2011 20
8 2 15 2005 5
9 3 24 2011 30
10 3 24 2005 6
推荐阅读
- javascript - toUpperCase 不能在 JavaScript 中使用对象中的项目
- flutter - 自适应 HLS 流 - Flutter video_player
- node.js - AWS Lambda 函数和 MongoDB 之间的连接超时
- java - 如何将带有类的 JAR 文件分发给其他开发人员?
- ios - 如何从相机迭代 YUV NV12 缓冲区中的像素并在 Obj-c 中设置颜色?
- mysql - 如何从具有更大 id 的记录中进行选择
- asp.net-mvc - 如何将数据从 Controller 传递到 _Layout.cshtml
- visual-studio-code - 如何添加语言支持(不安装扩展)?
- javascript - 在正确的端口 JS 上连接到 mysql
- css - 绝对位置的 z-index 在 datepicker bootsraps 中不起作用