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