R 计算每组一行数据与其余数据之间的差异

R 计算每组一行数据与其余数据之间的差异,r,dataframe,dplyr,data.table,R,Dataframe,Dplyr,Data.table,我有一个包含三个id组的data.table。第一组(batch1)具有固定的dx和变化的dy。第二组(batch1)和第三组(batch2)具有不同的dx和固定的dy 我想计算各组以1结尾的id行与以2和3等结尾的其他行之间的差异 我该怎么做呢?我对base、dplyr或data.table解决方案持开放态度 library(data.table) dt <- data.table( id = as.factor(c("batch1_dx0.0_dy-2.1_4", "batch1_

我有一个包含三个
id
组的
data.table
。第一组(
batch1
)具有固定的
dx
和变化的
dy
。第二组(
batch1
)和第三组(
batch2
)具有不同的
dx
和固定的
dy

我想计算各组以
1
结尾的
id
行与以
2
3
等结尾的其他行之间的差异

我该怎么做呢?我对
base
dplyr
data.table
解决方案持开放态度

library(data.table)
dt <- data.table(
  id = as.factor(c("batch1_dx0.0_dy-2.1_4", "batch1_dx0.0_dy0.155_3",
                   "batch1_dx0.0_dy1.23_2", "batch1_dx0.0_dy1_1", 
                   "batch1_dx-0.8_dy1.0_2", "batch1_dx0_dy1.0_1",
                   "batch1_dx1.321_dy1.0_3", "batch1_dx4.12_dy1.0_4",
                   "batch2_dx-0.8_dy1.0_2", "batch2_dx0_dy1.0_1",
                   "batch2_dx1.321_dy1.0_3", "batch2_dx4.12_dy1.0_4")),
  val1 = c(6, 2, 2, 0, 3, 1, 3, 3, 4, 5, 1),
  val2 = c(6, 4, 2, 1, 1, 1, 5, 3, 2, 8, 9),
  val3 = c(6, 3, 3, 0, 4, 2, 4, 1, 5, 7, 1))

                        id val1 val2 val3
 1:  batch1_dx0.0_dy-2.1_4    6    6    6
 2: batch1_dx0.0_dy0.155_3    2    4    3
 3:  batch1_dx0.0_dy1.23_2    2    2    3
 4:     batch1_dx0.0_dy1_1    0    1    0
 5:  batch1_dx-0.8_dy1.0_2    3    1    4
 6:     batch1_dx0_dy1.0_1    1    1    2
 7: batch1_dx1.321_dy1.0_3    3    5    4
 8:  batch1_dx4.12_dy1.0_4    3    3    1
 9:  batch2_dx-0.8_dy1.0_2    4    2    5
10:     batch2_dx0_dy1.0_1    5    8    7
11: batch2_dx1.321_dy1.0_3    1    9    1
12:  batch2_dx4.12_dy1.0_4    6    6    6

我们首先从每个
id
中提取最后一个数字部分。(
ind
)。然后,我们为每第四行创建一个组,对于
开头的每一列,我们从
ind
列中以1开头的值中减去它的值

library(dplyr)

 dt %>%
   mutate(ind = sub(".*_(\\d+$)", "\\1", id)) %>%
   group_by(group = gl(n()/4, 4)) %>%
   mutate_at(vars(starts_with("val")), list(d = ~(. - .[ind == 1]))) %>%
   ungroup() %>%
   select(-group, -ind)



#     id                     val1  val2  val3 val1_d val2_d val3_d
#    <fct>                  <dbl> <dbl> <dbl>  <dbl>  <dbl>  <dbl>
# 1 batch1_dx0.0_dy-2.1_4      6     6     6      6      5      6
# 2 batch1_dx0.0_dy0.155_3     2     4     3      2      3      3
# 3 batch1_dx0.0_dy1.23_2      2     2     3      2      1      3
# 4 batch1_dx0.0_dy1_1         0     1     0      0      0      0
# 5 batch1_dx-0.8_dy1.0_2      3     1     4      2      0      2
# 6 batch1_dx0_dy1.0_1         1     1     2      0      0      0
# 7 batch1_dx1.321_dy1.0_3     3     5     4      2      4      2
# 8 batch1_dx4.12_dy1.0_4      3     3     1      2      2     -1
# 9 batch2_dx-0.8_dy1.0_2      4     2     5     -1     -6     -2
#10 batch2_dx0_dy1.0_1         5     8     7      0      0      0
#11 batch2_dx1.321_dy1.0_3     1     9     1     -4      1     -6
#12 batch2_dx4.12_dy1.0_4      6     6     6      1     -2     -1
库(dplyr)
dt%>%
变异(ind=sub(“.\\\\d+$”,“\\1”,id))%>%
分组依据(group=gl(n()/4,4))%>%
在(vars(以“val”开头)、list(d=~(.-.[ind==1]))处进行变异%>%
解组()%>%
选择(-group,-ind)
#id val1 val2 val3 val1_d val2_d val3_d
#                              
#1批1_dx0.0_dy-2.1_4 6
#2批次1_dx0.0_dy0.155_3 2 3 3
#3批次1_dx0.0_dy1.23_2 1 3
#4批1_dx0.0_dy1_1 0 0 0 0 0
#5批次1_dx-0.8_dy1.0_2 3 1 4 2 0 2
#6批次1_dx0_dy1.0_1 1 2 0 0 0
#7批次1_dx1.321_dy1.0_3 5 4 2
#8批次1_dx4.12_dy1.0_4 3 2-1
#9批次2_dx-0.8_dy1.0_2 4 2 5-1-6-2
#10批次2_dx0_dy1.0_1 5 8 7 0 0 0 0
#11批次2_dx1.321_dy1.0_3 1 9 1-4 1-6
#12批次2_dx4.12_dy1.0_4 6 1-2-1

谢谢@Ronak再次帮助我。你在第7行和第8行的结果与我的手工计算不符。我认为这群人错了believe@ReeseWithouterspoon哦……是的。我使用了不同的逻辑来创建组。如何识别群体?当一组开始和结束时?每组有4行。无论是<代码> dx>代码>还是<代码> Dy < /C> >都改变了,但我不能认为每个组都有4行吗?或者我需要分别提取
dx
dy
值吗?是的,预先知道每组的行数,即4行
library(dplyr)

 dt %>%
   mutate(ind = sub(".*_(\\d+$)", "\\1", id)) %>%
   group_by(group = gl(n()/4, 4)) %>%
   mutate_at(vars(starts_with("val")), list(d = ~(. - .[ind == 1]))) %>%
   ungroup() %>%
   select(-group, -ind)



#     id                     val1  val2  val3 val1_d val2_d val3_d
#    <fct>                  <dbl> <dbl> <dbl>  <dbl>  <dbl>  <dbl>
# 1 batch1_dx0.0_dy-2.1_4      6     6     6      6      5      6
# 2 batch1_dx0.0_dy0.155_3     2     4     3      2      3      3
# 3 batch1_dx0.0_dy1.23_2      2     2     3      2      1      3
# 4 batch1_dx0.0_dy1_1         0     1     0      0      0      0
# 5 batch1_dx-0.8_dy1.0_2      3     1     4      2      0      2
# 6 batch1_dx0_dy1.0_1         1     1     2      0      0      0
# 7 batch1_dx1.321_dy1.0_3     3     5     4      2      4      2
# 8 batch1_dx4.12_dy1.0_4      3     3     1      2      2     -1
# 9 batch2_dx-0.8_dy1.0_2      4     2     5     -1     -6     -2
#10 batch2_dx0_dy1.0_1         5     8     7      0      0      0
#11 batch2_dx1.321_dy1.0_3     1     9     1     -4      1     -6
#12 batch2_dx4.12_dy1.0_4      6     6     6      1     -2     -1