如何在R(交叉引用数据帧)中执行基于标记的数据帧校正?

时间:2018-03-28 15:49:54

标签: r dplyr transformation tidyverse

用户,

我正在尝试根据另一个数据集(集合B)中的值更改一组数据(集合A)。两者共享一个几乎相同的计数器变量(TS)(由于不同的舍入而存在一些偏差 - 不幸的是不可避免)。此外,两组中的条目具有不同的频率(使A长于B)。

以下是集合A:

的示例
setA <- tibble(TS = c(rep(2.0913, 4), rep(2.123, 5)),
           AF3_S = 1:9,
           AF4_S = 1:9)

> setA
# A tibble: 9 x 3
     TS AF3_S AF4_S
  <dbl> <int> <int>
1  2.09     1     1
2  2.09     2     2
3  2.09     3     3
4  2.09     4     4
5  2.12     5     5
6  2.12     6     6
7  2.12     7     7
8  2.12     8     8
9  2.12     9     9

以下是集合B的示例:

setB <- tibble(TS = c(2.09131, 2.12304),
               AF3_Q = c(1,4),
               AF4_Q = c(3,0))

> setB
# A tibble: 2 x 3
     TS AF3_Q AF4_Q
  <dbl> <dbl> <dbl>
1  2.09  1.00  3.00
2  2.12  4.00  0   

我想要做的是,只要集合B中的标记小于2,就删除集合A中的条目。这种情况下的结果应该如下所示:

# A tibble: 9 x 3
     TS AF3_S AF4_S
  <dbl> <int> <int>
1  2.09    NA     1
2  2.09    NA     2
3  2.09    NA     3
4  2.09    NA     4
5  2.12     5    NA
6  2.12     6    NA
7  2.12     7    NA
8  2.12     8    NA
9  2.12     9    NA

我尝试用for循环完成此操作。但是,由于实际文件非常长(A~1.5Mio行,B~50K行),因此需要进行过多的迭代,这就是为什么循环不可能的原因。

有人会碰巧知道如何解决这个问题吗?我也有兴趣阅读材料,以便更多地了解如何在R中有效地处理这些问题。

谢谢你,以及最好的问候

迈克尔

1 个答案:

答案 0 :(得分:0)

您的数据

setA <- tibble(TS = c(rep(2.0913, 4), rep(2.123, 5)),
           AF3_S = 1:9,
           AF4_S = 1:9)

setB <- tibble(TS = c(2.09131, 2.12304),
               AF3_Q = c(1,4),
               AF4_Q = c(3,0))

你要做的第一件事就是当两个double'相等'时。让我们说吧 当第二个十进制数字匹配时,值相等,您可以使用

round(setA$TS * 100) == round(setB$TS[1] * 100)
# [1]  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE

现在我们可以使用match返回与setB$TS匹配的setA$TS的行索引

I <- match(round(setA$TS*100), round(setB$TS*100))
I
# [1] 1 1 1 1 2 2 2 2 2

请注意,I的长度等于setA的行数,但值是setB

的行索引

然后,对于每列,我们使用ifelse返回条件值

setA$AF3_S <- ifelse(setB$AF3_Q[I] < 2, NA, setA$AF3_S)
setA$AF4_S <- ifelse(setB$AF4_Q[I] < 2, NA, setA$AF4_S)
setA

# A tibble: 9 x 3
     # TS AF3_S AF4_S
  # <dbl> <int> <int>
# 1  2.09    NA     1
# 2  2.09    NA     2
# 3  2.09    NA     3
# 4  2.09    NA     4
# 5  2.12     5    NA
# 6  2.12     6    NA
# 7  2.12     7    NA
# 8  2.12     8    NA
# 9  2.12     9    NA