R 具有不同长度组的数据帧中的成对减法

R 具有不同长度组的数据帧中的成对减法,r,combn,R,Combn,我有一个18528行3列的数据框,如下所示: Sample Target Value 100 A 21.5 100 A 20.5 100 B 19.5 100 B 19.75 100 B 18.15 100 B 21.95 200 A 21.1 200 A 21.6 200 B 23.5 200

我有一个18528行3列的数据框,如下所示:

Sample  Target  Value
100      A       21.5
100      A       20.5
100      B       19.5
100      B       19.75
100      B       18.15
100      B       21.95
200      A       21.1
200      A       21.6
200      B       23.5
200      B       20.75
100      C       21.25
100      C       22.0
100      C       18.33
100      C       21.84
我需要计算各组值之间的差异:

Sample  Target  Value   dif
100      A       21.5   1
100      A       20.5   1
100      B       19.5   0.25
100      B       19.75  1.6
100      B       18.15  3.8
100      B       21.95  2.45
200      A       21.1   0.5
200      A       21.6   0.5
200      B       23.5   2.75
200      B       20.75  2.75
100      C       21.25  0.75
100      C       22.0   3.67
100      C       18.33  3.51
100      C       21.84  0.59
如果差值大于2,则将该值设为“NA”,如下所示:

我使用combn计算差异,但我得到了错误,我认为原因可能是组(2和4)的长度不同。
提前感谢

您可以使用
dplyr
软件包获得所需的输出。如果尚未安装,请首先运行命令
install.packages(“dplyr”)
或手动安装

那么我们有:

require("dplyr")

mydf <- read.table(text = "
Sample  Target  Value
100      A       21.5
100      A       20.5
100      B       19.5
100      B       19.75
100      B       18.15
100      B       21.95
200      A       21.1
200      A       21.6
200      B       23.5
200      B       20.75
100      C       21.25
100      C       22.0
100      C       18.33
100      C       21.84", header = T)

mydf1 <- mydf %>% group_by(Sample, Target) %>% 
  mutate(ValueShifted = c(Value[-1], Value[1]) ) %>%
  mutate(dif = abs(Value - ValueShifted) ) %>%
  mutate(NewValue = c(1, NA)[(as.numeric(dif > 2)+1)] * Value )

> mydf1
Source: local data frame [14 x 6]
Groups: Sample, Target

   Sample Target Value ValueShifted  dif NewValue
1     100      A 21.50        20.50 1.00    21.50
2     100      A 20.50        21.50 1.00    20.50
3     100      B 19.50        19.75 0.25    19.50
4     100      B 19.75        18.15 1.60    19.75
5     100      B 18.15        21.95 3.80       NA
6     100      B 21.95        19.50 2.45       NA
7     200      A 21.10        21.60 0.50    21.10
8     200      A 21.60        21.10 0.50    21.60
9     200      B 23.50        20.75 2.75       NA
10    200      B 20.75        23.50 2.75       NA
11    100      C 21.25        22.00 0.75    21.25
12    100      C 22.00        18.33 3.67       NA
13    100      C 18.33        21.84 3.51       NA
14    100      C 21.84        21.25 0.59    21.84
require(“dplyr”)
多年筹资框架%
变异(ValueShift=c(值[-1],值[1]))%>%
变异(dif=abs(值-值移位))%>%
变异(NewValue=c(1,NA)[(如数字(dif>2)+1)]*值)
>多年筹资框架1
来源:本地数据帧[14 x 6]
分组:样本、目标
样本目标值移位dif新值
1100 A 21.50 20.50 1.00 21.50
2100 A 20.50 21.50 1.00 20.50
3100B19.5019.750.2519.50
4100B19.7518.15160 19.75
5100B18.1521.953.80NA
6100B21.9519.502.45NA
7200A21.1021.600.5021.10
8200 A 21.60 21.10 0.50 21.60
9200B23.5020.752.75NA
10200B20.7523.502.75NA
11 100 C 21.25 22.00 0.75 21.25
12 100 C 22.00 18.33 3.67 NA
13 100 C 18.33 21.84 3.51 NA
14 100 C 21.84 21.25 0.59 21.84

我想一个群体就是一对夫妇(样本、目标)?事实上,在您呈现的输出中,您将第3行的值提取到第2行的值,以获得第2行的dif……准确地说,谢谢您的编辑:)是的,但我的意见是,您所说的关于gorup的内容与您呈现为输出的内容之间存在很大差异(由于您采用了连续值的差异,因此没有分组)。所以我想知道你最终想要什么结果…我的意思是什么;共有5组(A-100、B-100、A-200、B-200、C-100),我想计算每组值之间的差异。实际上,您只需要计算您拥有的值与组内最大值和最小值之间的差异。谢谢,它以某种方式起作用,但在最后一组中,18.33应为“NA”,如果这样做,该组的其他差异将小于2,第二组的差异将相同(21.95)。好的,我没有完全理解计算dif的规则。对于
x=c(1.1,1.5,2.5,3)
,它会是什么样子?我假设第I行的差
x[I]-x[I+1]
,最后循环到第一个值。但也许我在计算dif时出错了,所以请纠正我。另一个问题:您需要删除一组最小值才能使所有
dif
s<2?这与组内的
(最大(值)-min(值))<2
情况相同吗?如果组中的值为
15.5 19.5 20
?因此,请您详细说明您需要对数据做什么以及规则是什么。感谢您的考虑,可以说,在15.5 19.5 20中,应该删除差值大于2的值;15和15.5应删除,因为19.5-15.5=4>2和20-15=5>2删除这些值后,我们将得到19.5和20,差值小于2。我希望我能解释清楚。
require("dplyr")

mydf <- read.table(text = "
Sample  Target  Value
100      A       21.5
100      A       20.5
100      B       19.5
100      B       19.75
100      B       18.15
100      B       21.95
200      A       21.1
200      A       21.6
200      B       23.5
200      B       20.75
100      C       21.25
100      C       22.0
100      C       18.33
100      C       21.84", header = T)

mydf1 <- mydf %>% group_by(Sample, Target) %>% 
  mutate(ValueShifted = c(Value[-1], Value[1]) ) %>%
  mutate(dif = abs(Value - ValueShifted) ) %>%
  mutate(NewValue = c(1, NA)[(as.numeric(dif > 2)+1)] * Value )

> mydf1
Source: local data frame [14 x 6]
Groups: Sample, Target

   Sample Target Value ValueShifted  dif NewValue
1     100      A 21.50        20.50 1.00    21.50
2     100      A 20.50        21.50 1.00    20.50
3     100      B 19.50        19.75 0.25    19.50
4     100      B 19.75        18.15 1.60    19.75
5     100      B 18.15        21.95 3.80       NA
6     100      B 21.95        19.50 2.45       NA
7     200      A 21.10        21.60 0.50    21.10
8     200      A 21.60        21.10 0.50    21.60
9     200      B 23.50        20.75 2.75       NA
10    200      B 20.75        23.50 2.75       NA
11    100      C 21.25        22.00 0.75    21.25
12    100      C 22.00        18.33 3.67       NA
13    100      C 18.33        21.84 3.51       NA
14    100      C 21.84        21.25 0.59    21.84