如何在 R(交叉引用数据帧)中执行基于标记的数据帧校正?
How to perform marker based correction of data frame in R (cross-referencing data frames)?
用户,
我正在尝试根据另一个数据集(集 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 行),需要太多的迭代,这就是为什么循环是不可能的。
有没有人碰巧知道如何解决这个问题?我也有兴趣阅读 material 以了解有关如何在 R 中有效处理此类问题的更多信息。
谢谢你和最好的问候
迈克尔
您的数据
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
到 return 匹配 setA$TS
的 setB$TS
的 row-indices
I <- match(round(setA$TS*100), round(setB$TS*100))
I
# [1] 1 1 1 1 2 2 2 2 2
注意 I
的长度等于 setA
的 number-of-rows 但值是 setB
[=22= 的 row-indices ]
然后对于每一列,我们使用 ifelse
到 return 一个条件值
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
用户,
我正在尝试根据另一个数据集(集 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 行),需要太多的迭代,这就是为什么循环是不可能的。
有没有人碰巧知道如何解决这个问题?我也有兴趣阅读 material 以了解有关如何在 R 中有效处理此类问题的更多信息。
谢谢你和最好的问候
迈克尔
您的数据
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
到 return 匹配 setA$TS
setB$TS
的 row-indices
I <- match(round(setA$TS*100), round(setB$TS*100))
I
# [1] 1 1 1 1 2 2 2 2 2
注意 I
的长度等于 setA
的 number-of-rows 但值是 setB
[=22= 的 row-indices ]
然后对于每一列,我们使用 ifelse
到 return 一个条件值
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