如何从3个或更多分组数据框中的列中找到匹配值?

时间:2019-07-15 17:43:15

标签: r dplyr

我已将数据帧分组(在我的情况下,三个数据帧分组在一起)。我想根据一列中的值找到所有三个数据框之间的交点。

我一直在使用dplyr相交函数,但是看不到如何将其用于分组的数据帧。我想在所有三个数据框中找到具有相同Start.Coord值的所有行。

这是一次失败的尝试,并显示了错误消息:

SameWithinTreatment <= SorbitolGroup %>% group_by(Sample) %>% intersect(Start.Coord)
Error in intersect_data_frame(x, y) : object 'Start.Coord' not found

很显然,我需要另一个参数来赋予intersect()。我看到intersect()似乎不是我需要的功能,但似乎必须有一种方法可以完成我需要的工作。

我已经做了很多搜索,但是我发现的所有内容仅适用于2个数据帧。

这是我分组数据框中的一些示例数据。在这三个之间有一个具有相同Start.Coord值的行:以8805作为Start.Coord的行。

  Start.Coord Stop.Coord Sample      Coverage normalized.coverage Average.Normalized.Covera~ SD.of.Normalized.Covera~ TwoSD
        <int>      <int> <chr>          <int>               <dbl>                      <dbl>                    <dbl> <dbl>
1        1019       1023 X1.combined       19                  18                       9.91                     3.98  7.95
2        1510       1514 X1.combined       19                  18                       9.91                     3.98  7.95
3        1514       1518 X1.combined       19                  18                       9.91                     3.98  7.95
4        1520       1524 X1.combined       19                  18                       9.91                     3.98  7.95
5        8805       8809 X1.combined       19                  18                       9.91                     3.98  7.95
6       48185      48189 X1.combined       19                  18                       9.91                     3.98  7.95

  Start.Coord Stop.Coord Sample Coverage normalized.coverage Average.Normalized.Coverage SD.of.Normalized.Coverage TwoSD
        <int>      <int> <chr>     <int>               <dbl>                       <dbl>                     <dbl> <dbl>
1       8805      8809 X2          167                 166                        122.                      21.7  43.4
2       11874      11878 X2          169                 168                        122.                      21.7  43.4
3       12042      12046 X2          169                 168                        122.                      21.7  43.4
4       18321      18325 X2          175                 174                        122.                      21.7  43.4
5       25187      25191 X2          167                 166                        122.                      21.7  43.4
6       25308      25312 X2          194                 193                        122.                      21.7  43.4

  Start.Coord Stop.Coord Sample Coverage normalized.coverage Average.Normalized.Coverage SD.of.Normalized.Coverage TwoSD
        <int>      <int> <chr>     <int>               <dbl>                       <dbl>                     <dbl> <dbl>
1        8805       8809 X3          132                 131                        94.4                      16.7  33.5
2       10340      10344 X3          135                 134                        94.4                      16.7  33.5
3       11874      11878 X3          141                 140                        94.4                      16.7  33.5
4       12042      12046 X3          137                 136                        94.4                      16.7  33.5
5       18209      18213 X3          133                 132                        94.4                      16.7  33.5
6       18218      18222 X3          143                 142                        94.4                      16.7  33.5

所以我想找回一个看起来像这样的新数据框:

Start.Coord Stop.Coord Sample Coverage normalized.coverage Average.Normalized.Coverage SD.of.Normalized.Coverage TwoSD
8805       8809 X1.combined       19                  18                       9.91                     3.98  7.95
8805      8809 X2          167                 166                        122.                      21.7  43.4
8805       8809 X3          132                 131                        94.4                      16.7  33.5

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:0)

如果您的3个数据框具有相同的列名,请使用rbind进行合并 SorbitolGroup<- rbind(df1,df2,df3) 然后加 Start.Coordgroup_by

SorbitolGroup %>% group_by(Sample,Start.Coord)

如果您要计算两组的观测值

SorbitolGroup %>% group_by(Sample,Start.Coord) %>% tally()

答案 1 :(得分:0)

除了@ W148SMH建议之外,听起来您还需要使用filter()

a <- data.frame(sample='a',value=sample(1:10,10,T))
b <- data.frame(sample='b',value=sample(1:10,10,T))
c <- data.frame(sample='c',value=sample(1:10,10,T))

df <- rbind(a,b,c)
summary(df)

df %>% filter(value==9)
df_new <- df %>% filter(value==9) # new data frame including all cases with value==9

df %>% count(sample,value)

df %>% group_by(sample,value) %>% 
  summarise(...) # to summarise other variables at each level of sample and value