首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >匹配特定列中的上一行并在R中执行计算

匹配特定列中的上一行并在R中执行计算
EN

Stack Overflow用户
提问于 2020-04-21 05:34:19
回答 2查看 93关注 0票数 4

我目前有一个类似于此的数据文件:

代码语言:javascript
运行
复制
R ID A B    
1 A1 0 0  
2 A1 2 4  
3 A1 4 8    
4 A2 0 0  
5 A2 3 3  
6 A2 6 6

我想编写一个脚本,它只在"ID“匹配的情况下才能从上一行计算"(8-4)/(4-2)”。例如,在第3行中的列"C“的输出中,如果"ID”列中的A1 == A1,则(8-4)/(4-2) = 2,如果A1 != A1,则输出为0。

我希望产出是这样的:

代码语言:javascript
运行
复制
R ID A B C   
1 A1 0 0 0  
2 A1 2 4 2  
3 A1 4 8 2     
4 A2 0 0 0  
5 A2 3 3 1   
6 A2 6 6 1  

希望我以一种不让人困惑的方式正确地解释了这一点。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-21 05:41:49

我们可以使用group_by ID,使用diff计算行间的差和除法。

代码语言:javascript
运行
复制
library(dplyr)
df %>% group_by(ID) %>% mutate(C = c(0, diff(B)/diff(A)))

#      R ID        A     B     C
#  <int> <fct> <int> <int> <dbl>
#1     1 A1        0     0     0
#2     2 A1        2     4     2
#3     3 A1        4     8     2
#4     4 A2        0     0     0
#5     5 A2        3     3     1
#6     6 A2        6     6     1

并且类似地使用data.table

代码语言:javascript
运行
复制
library(data.table)
setDT(df)[, C := c(0, diff(B)/diff(A)), ID]

数据

代码语言:javascript
运行
复制
df <- structure(list(R = 1:6, ID = structure(c(1L, 1L, 1L, 2L, 2L, 
2L), .Label = c("A1", "A2"), class = "factor"), A = c(0L, 2L, 
4L, 0L, 3L, 6L), B = c(0L, 4L, 8L, 0L, 3L, 6L)), class = "data.frame", 
row.names = c(NA, -6L))
票数 3
EN

Stack Overflow用户

发布于 2020-04-21 20:29:46

我们也可以使用lag

代码语言:javascript
运行
复制
library(dplyr)
df %>% 
   group_by(ID) %>% 
   mutate(C = (B - lag(B, default = first(B)))/(A - lag(A, default = first(A))))

数据

代码语言:javascript
运行
复制
df <- structure(list(R = 1:6, ID = structure(c(1L, 1L, 1L, 2L, 2L, 
2L), .Label = c("A1", "A2"), class = "factor"), A = c(0L, 2L, 
4L, 0L, 3L, 6L), B = c(0L, 4L, 8L, 0L, 3L, 6L)), class = "data.frame", 
row.names = c(NA, -6L))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61336598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档