【问题标题】:R - Changing values based on referenceR - 根据参考更改值
【发布时间】:2016-03-29 17:58:19
【问题描述】:

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

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 对和 >60,000 个区域。这些区域都具有相同的起点和终点,因此没有重叠。

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

  • 该区域的 N 个个体的 Value 是 != 3(不等于 3)&
  • Value 用于该地区的 N-individual 和 T-individual 匹配(例如 N-ind = 2 & T-ind = 2),

然后将 N 和 T 个体中对应的Value 更改为 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没有改变Values,因为N的Value = 3;区域 101-200,没有改变,因为 N 和 T 的 Values 不一样。

我想到了使用 dplyr 对匹配项进行分组,例如:

df <- df %>% arrange(ID, Ind, RegionStart, TN) %>% group_by(ID)

或者也许使用data.table,但将ID设置为键?但我仍然不确定如何轻松比较行。我对 dplyr 和 data.table 还是很陌生,所以如果你使用这些命令,对命令的简短解释会很好。不过,请随意使用另一个包。不过数据量很大,所以需要高效。

【问题讨论】:

    标签: r


    【解决方案1】:

    带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
      })
    

    工作原理: uniqueNn_distinct 计算向量中不同值的数量。如果Value 的两个元素相同,那么这将返回1L

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-22
      • 2014-03-06
      • 1970-01-01
      相关资源
      最近更新 更多