r - 计算列值之间的差异

标签 r difference

dat <- data.frame(s=c(1,1,1,1,2,2,2,2,3,3,3,3),               
                 c1=c("w","x","y","z","w","x","y","z","w","x","y","z"), 
                 c2=c("m","m","m","m","f","f","f","f","m","m","m","m"), 
                 c3=c(1,2,3,4,5,6,7,8,9,10,11,12))

> dat
       s c1 c2 c3
    1  1  w  m  1
    2  1  x  m  2
    3  1  y  m  3
    4  1  z  m  4
    5  2  w  f  5
    6  2  x  f  6
    7  2  y  f  7
    8  2  z  f  8
    9  3  w  m  9
    10 3  x  m 10
    11 3  y  m 11
    12 3  z  m 12

我想计算 c3 之间的差异c1 的每个组合的值(w-x、x-y 等)并且对于每个 s 。输出可能如下所示

s  diff  c2  c3
1  w-x   m   -1
1  w-y   m   -2
1  w-z   m   -3
1  x-y   m   -1
etc

我以为aggregate函数应该可以工作,但我不知道如何定义组合并将它们传递给函数参数。

最佳答案

如果您愿意使用dplyr,这样的东西应该可以工作。

dat <- data.frame(s=c(1,1,1,1,2,2,2,2,3,3,3,3), c1=c("w","x","y","z","w","x","y","z","w","x","y","z"), c2=c("m","m","m","m","f","f","f","f","m","m","m","m"), c3=c(1,2,3,4,5,6,7,8,9,10,11,12))

library(dplyr)
dat$c1 <- as.character(dat$c1)
dat2 <- dat %>%
  left_join(dat, by = c("s", "c2")) %>%
  filter(c1.x > c1.y) %>%
  transmute(s, diff = paste(c1.y, c1.x, sep = "-"), c2, c3 = c3.y - c3.x)

dat2

##    s diff c2 c3
## 1  1  w-x  m -1
## 2  1  w-y  m -2
## 3  1  x-y  m -1
## 4  1  w-z  m -3
## 5  1  x-z  m -2
## 6  1  y-z  m -1
## 7  2  w-x  f -1
## 8  2  w-y  f -2
## 9  2  x-y  f -1
## 10 2  w-z  f -3
## 11 2  x-z  f -2
## 12 2  y-z  f -1
## 13 3  w-x  m -1
## 14 3  w-y  m -2
## 15 3  x-y  m -1
## 16 3  w-z  m -3
## 17 3  x-z  m -2
## 18 3  y-z  m -1

关于r - 计算列值之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53404385/

相关文章:

r - 添加列(如果不存在)

R:撤消排序/取消排序/切换回初始顺序

r - 如何在其他脚本中包含(源)R 脚本

r - 错误 : $ operator not defined for this S4 class

php - 解决 PHP 中的日期时间差异

mysql - 计算每个单元格与下一个单元格的日期差异

python - 查找合并(外部 - 内部)Pandas DF 差异

r - 如何连接到 R 语言的 Unix 域(AF_UNIX)套接字?

mysql - 从时间值中减去 datediff

javascript - 计算Javascript中两个纪元时间戳之间的秒数差异