我有一个大数据框,这是我的分析信息表。其中的一部分如下所示:
df<-read.table(text=" V1 V2 V3 V4 V5
1 id1 id2 (1,2.5) (2.5,4) (4,5.5)
2 a a 1.5147654 1.5147654 1.5147654
3 a c 1.97638457 1.97638457 1.97638457
4 c d 1.55151792 -2.38160971 1.55151792
5 a b 2.25182522 2.25182522 -1.3523473
6 b d 1.85349445 1.85349445 1.85349445
",
header=TRUE)
如图所示,最后一行包含数字区间,我不知道如何在R中读取它们作为连续范围。
其次,我有多个表,我想在它们的值和这个主数据框之间进行比较。为了说明,我的表的子集是这样的:
sample<-read.table(text=" V1 V2 V3
1 a b 1
2 a c 1.5
3 d b 3.5
4 d c 5.1
",
header=TRUE)
我喜欢将样本与我的df进行比较,例如,在第一行样本中,'a'在'b'旁边,值为'1'。但是在df中如果a接下来且值为1,则根据间隔,它必须在样本表中更改为2.25182522。最终结果如下:
V1 V2 V3
1 a b 2.25182522
2 a c 1.97638457
3 d b 1.85349445
4 d c 1.55151792
由于我有很多样本表并且它们的大小很大,所以有任何想法吗?
答案 0 :(得分:0)
你的第一个问题对我来说很模糊。但对于你的第二个问题,我认为这是一个合并问题。关键是根据两个数据集的V1
和V2
的顺序创建合并ID。以下基于包dplyr的代码首先创建该合并ID,然后执行left_join
。 df3
是最终输出。
library(dplyr)
df3 <- df2 %>%
mutate(Merge_ID = apply(df2[, c("V1", "V2")], 1,
function(x) paste0(sort(x), collapse = "_"))) %>%
select(-V3) %>%
left_join(df1 %>% mutate(
Merge_ID = apply(df1[, c("V1", "V2")], 1,
function(x) paste0(sort(x), collapse = "_"))) %>%
select(Merge_ID, V3),
by = "Merge_ID") %>%
select(-Merge_ID) %>%
mutate(V3 = as.numeric(V3))
df3
# V1 V2 V3
# 1 a b 2.251825
# 2 a c 1.976385
# 3 d b 1.853494
# 4 d c 1.551518
数据强>
df1 <- read.table(text=" V1 V2 V3 V4 V5
1 id1 id2 (1,2.5) (2.5,4) (4,5.5)
2 a a 1.5147654 1.5147654 1.5147654
3 a c 1.97638457 1.97638457 1.97638457
4 c d 1.55151792 -2.38160971 1.55151792
5 a b 2.25182522 2.25182522 -1.3523473
6 b d 1.85349445 1.85349445 1.85349445
",
header=TRUE, stringsAsFactors = FALSE)
df2 <- read.table(text=" V1 V2 V3
1 a b 1
2 a c 1.5
3 d b 3.5
4 d c 5.1
",
header=TRUE, stringsAsFactors = FALSE)