R-根据参考更改值

R-根据参考更改值,r,R,我有一个数据框,看起来像这个玩具示例: Ind ID RegionStart RegionEnd Value TN 1 A 1 100 3 N 1 A 101 200 2 N 2 A 1 100 3 T 2 A

我有一个数据框,看起来像这个玩具示例:

Ind     ID    RegionStart     RegionEnd    Value     TN
1       A       1              100           3       N
1       A       101            200           2       N
2       A       1              100           3       T
2       A       101            200           2       T
3       B       1              100           3       N
3       B       101            200           2       N
4       B       1              100           5       T
4       B       101            200           5       T
我有4个人,实际上是2对(一个参考,N,一个主题,T)。为简单起见,只有2对,只有2个区域。在我的真实文件中,有>500对和>60000个区域。这些区域都具有相同的起点和终点,因此没有重叠

我想做的是根据
ID
+
区域
匹配个人,如果

  • 该区域N个个体的
    值为!=3(不等于3)和
  • 该区域中N个个体和T个个体匹配的
    值(例如N-ind=2和T-ind=2)
然后将两个N&T个体中相应的
值更改为3

从上面得到的表格将是:

Ind     ID    RegionStart     RegionEnd    Value     TN
1       A       1              100           3       N
1       A       101            200           3       N
2       A       1              100           3       T
2       A       101            200           3       T
3       B       1              100           3       N
3       B       101            200           2       N
4       B       1              100           5       T
4       B       101            200           5       T
注意,
ID=B
,区域
1-100
没有改变
s,因为N的
值=3
;区域
101-200
,没有变化,因为N&T的
s不相同

我考虑使用dplyr对匹配进行分组,例如:

df <- df %>% arrange(ID, Ind, RegionStart, TN) %>% group_by(ID)
df%arrange(ID,Ind,RegionStart,TN)%%>%groupby(ID)
或者使用data.table,但将ID设置为键?但我仍然不知道如何轻松地比较行。我对dplyr&data.table还是相当陌生的,所以如果您使用这些命令,对该命令的简短解释将非常有用。不过,请随意使用另一个软件包。但是数据非常大,因此需要高效。

对于data.table:

library(data.table)
setDT(DF)

DF[, Value := { 
  fixit = ( Value[TN=="N"] != 3L ) & ( uniqueN(Value) == 1L )
  if (fixit) 3L else Value
}, by=.(ID, RegionStart)]
请注意,这将更改原始数据集(而不是简单地返回修改过的表)


使用dplyr:

library(dplyr)
DF %>% group_by(ID, RegionStart) %>% 
  mutate(Value = {
    fixit = ( Value[TN=="N"] != 3L ) & ( n_distinct(Value) == 1L )
    if (fixit) 3L else Value
  })

工作原理:
uniqueN
n_distinct
计算向量中不同值的数量。如果
值的两个元素相同,则返回
1L

和数据。表:

library(data.table)
setDT(DF)

DF[, Value := { 
  fixit = ( Value[TN=="N"] != 3L ) & ( uniqueN(Value) == 1L )
  if (fixit) 3L else Value
}, by=.(ID, RegionStart)]
请注意,这将更改原始数据集(而不是简单地返回修改过的表)


使用dplyr:

library(dplyr)
DF %>% group_by(ID, RegionStart) %>% 
  mutate(Value = {
    fixit = ( Value[TN=="N"] != 3L ) & ( n_distinct(Value) == 1L )
    if (fixit) 3L else Value
  })

工作原理:
uniqueN
n_distinct
计算向量中不同值的数量。如果
值的两个元素相同,则返回
1L