查找/匹配R中

时间:2017-07-22 19:56:32

标签: r merge dplyr lookup

我根据第一个数据表的属性合并了两个数据集。

dat1 <- read.table(header=TRUE, text="
ID  log MN  CD  NM
a001    0.1 dat01   mn34    tt03
                   a002 2.3 dat02   mn35    tt09
                   a003 4.5 dat03   mn36    tt15
                   a004 7.89    dat04   mn37    tt21
                   a005 4.1 dat05   mn38    tt27
                   a006 4.5 dat06   mn39    tt33
                   a007 6.1 dat13   mn40    tt39
                   a008 9   dat14   mn41    tt45
                   a009 2.3 dat15   mn42    tt51
                   a010 3.4 dat16   mn01    tt57
                   a011 3.23    dat17   mn02    tt63
                   a012 1.23    dat18   mn03    tt69
                   a013 2.11    dat19   mn04    tt75
                   ")
dat1
     ID  log    MN   CD   NM
1  a001 0.10 dat01 mn34 tt03
2  a002 2.30 dat02 mn35 tt09
3  a003 4.50 dat03 mn36 tt15
4  a004 7.89 dat04 mn37 tt21
5  a005 4.10 dat05 mn38 tt27
6  a006 4.50 dat06 mn39 tt33
7  a007 6.10 dat13 mn40 tt39
8  a008 9.00 dat14 mn41 tt45
9  a009 2.30 dat15 mn42 tt51
10 a010 3.40 dat16 mn01 tt57
11 a011 3.23 dat17 mn02 tt63
12 a012 1.23 dat18 mn03 tt69
13 a013 2.11 dat19 mn04 tt75


dat2 <- read.table(header=TRUE, text="
ID  LT  LF  DC  TM  NM
a001    0   1   p01 p001    pn07
                   a003 4.1 4.9 p02 p002    pn08
                   a004 2.1 5.6 p03 p003    pn09
                   a008 8.7 9.29    p04 p004    pn10
                   a009 2   2.3 p05 p005    pn11
                   a010 1   2   p06 p006    pn12
                   a023 1   2   p07 p007    pn13
                   a024 1   2   p08 p008    pn14
                   ")

dat2

    ID  LT   LF  DC   TM   NM
1 a001 0.0 1.00 p01 p001 pn07
2 a003 4.1 4.90 p02 p002 pn08
3 a004 2.1 5.60 p03 p003 pn09
4 a008 8.7 9.29 p04 p004 pn10
5 a009 2.0 2.30 p05 p005 pn11
6 a010 1.0 2.00 p06 p006 pn12
7 a023 1.0 2.00 p07 p007 pn13
8 a024 1.0 2.00 p08 p008 pn14

dat1有一个名为log的列,在LT LF dat2范围内需要LT <=log <=LFID }}与dplyr匹配后。我正在mutate ID log LT LF MN CD NM DC TM NM.1 1 a001 0.1 0.0 1.00 dat01 mn34 tt03 p01 p001 pn07 2 a003 4.5 4.1 4.90 dat03 mn36 tt15 p02 p002 pn08 3 a008 9.0 8.7 9.29 dat14 mn41 tt45 p04 p004 pn10 4 a009 2.3 2.0 2.30 dat15 mn42 tt51 p05 p005 pn11 一起尝试但不能正常工作。输出将如下:

for i in range(0,len(df.columns)):
    df.iloc[:,i] = np.where(df['Month_Counter'] >= i + 1, 'X', df.iloc[:,i])

我希望为两个表中的所有列值合并数据。这只是一个包含2,000,000行和1700列的大型表的示例。

2 个答案:

答案 0 :(得分:2)

library(dplyr)
dat <- left_join(dat1, dat2, by = "ID")
dat_fil <- filter(dat, log >= LT, log <= LF)
dat_fil

    ID log    MN   CD NM.x  LT   LF  DC   TM NM.y
1 a001 0.1 dat01 mn34 tt03 0.0 1.00 p01 p001 pn07
2 a003 4.5 dat03 mn36 tt15 4.1 4.90 p02 p002 pn08
3 a008 9.0 dat14 mn41 tt45 8.7 9.29 p04 p004 pn10
4 a009 2.3 dat15 mn42 tt51 2.0 2.30 p05 p005 pn11

答案 1 :(得分:1)

尝试data.table方式:)

dat1 = data.table(dat1)
dat2 = data.table (dat2)

merged.dat = dat2 [dat1, on = "ID"] [ LT <= log & log <= LF ]

给你:

     ID  LT   LF  DC   TM   NM log    MN   CD i.NM
1: a001 0.0 1.00 p01 p001 pn07 0.1 dat01 mn34 tt03
2: a003 4.1 4.90 p02 p002 pn08 4.5 dat03 mn36 tt15
3: a008 8.7 9.29 p04 p004 pn10 9.0 dat14 mn41 tt45
4: a009 2.0 2.30 p05 p005 pn11 2.3 dat15 mn42 tt51

您可以通过键入表格来进一步优化速度。输入?data.table并检查快速&#34;键入&#34;子集并通过小插图