根据另一个数据帧的连续间隔改变数据帧的值

时间:2018-05-15 08:33:32

标签: r dataframe merge range intervals

我有一个大数据框,这是我的分析信息表。其中的一部分如下所示:

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

由于我有很多样本表并且它们的大小很大,所以有任何想法吗?

1 个答案:

答案 0 :(得分:0)

你的第一个问题对我来说很模糊。但对于你的第二个问题,我认为这是一个合并问题。关键是根据两个数据集的V1V2的顺序创建合并ID。以下基于包的代码首先创建该合并ID,然后执行left_joindf3是最终输出。

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)