如何根据标签匹配组织和移动数据行

时间:2017-11-14 04:46:04

标签: r dataframe dplyr aggregate tidyr

我的原始数据如下所示。我试图将与其匹配的标签对应的一行数据移动到数据框中的新位置。

//*[contains(@id, 'yui-patched') and contains(@role,'menuitem')]

我想匹配三个N前缀标签的值:610,181920和181930及其对应的L前缀标签。基本上将该行数据作为新行移动到L前缀中,例如标记为0或8。因此,标签610的结果如下所示:

dat<-read.table(text='RowLabels col1    col2    col3    col4    col5    col6
L   24363.7 25944.9 25646.1 25335.4 23564.2 25411.5
             610    411.4   439 437.3   436.9   420.7   516.9
             1  86.4    113.9   103.5   113.5   80.3    129
             2  102.1   99.5    96.3    100.4   99.5    86
             3  109.7   102.2   100.2   112.9   92.3    123.8
             4  88.9    87.1    103.6   102.5   93.6    134.1
             5  -50.3   -40.2   -72.3   -61.4   -27 -22.7
             6  -35.3   -9.3    25.3    -0.3    15.6    -27.3
             7  109.9   85.8    80.7    69.3    66.4    94
             181920 652.9   729.2   652.1   689.1   612.5   738.4
             1  104.3   107.3   103.5   104.2   98.3    110.1
             2  103.6   102.6   100.1   103.2   88.8    117.7
             3  53.5    99.1    46.7    70.3    53.9    32.5
             4  93.5    107.2   98.3    99.3    97.3    121.1
             5  96.8    109.3   104 102.2   98.7    112.9
             6  103.6   96.9    104.7   104.4   91.5    137.7
             7  97.6    106.8   94.8    105.5   84  106.4
             181930 732.1   709.6   725.8   729.5   554.5   873.1
             1  118.4   98.8    102.3   102 101.9   115.8
             2  96.7    103.3   104.6   105.2   81.9    128.7
             3  96  98.2    99.4    97.9    69.8    120.6
             4  100.7   101 103.6   106.6   59.6    136.2
             5  106.1   103.4   104.7   104.8   76.1    131.8
             6  105 102.1   103 108.3   81  124.7
             7  109.2   102.8   108.2   104.7   84.2    115.3
             N  3836.4  4395.8  4227.3  4567.4  4009.9  4434.6
             610    88.1    96.3    99.6    92  90  137.6
             1  88.1    96.3    99.6    92  90  137.6
             181920 113.1   100.6   106.5   104.2   87.3    108.2
             1  113.1   100.6   106.5   104.2   87.3    108.2
             181930 111.3   99.1    104.5   115.5   103.6   118.8
             1  111.3   99.1    104.5   115.5   103.6   118.8
             ',header=TRUE)

这可能吗?我尝试搜索,我发现一些资源指向dplyr或tidyr或聚合。但我找不到符合我案例的好榜样。 How to combine rows based on unique values in R?Aggregate rows by shared variables

2 个答案:

答案 0 :(得分:1)

希望这有帮助!

library(dplyr)
library(zoo)

df <- dat %>%
  filter(grepl("^\\d+$",RowLabels)) %>%
  mutate(RowLabels_temp = ifelse(grepl("^\\d{3,}$",RowLabels), as.numeric(as.character(RowLabels)), NA)) %>%
  na.locf() %>%
  select(-RowLabels) %>%
  distinct() %>%
  group_by(RowLabels_temp) %>%
  mutate(RowLabels_indexed = row_number()-1) %>%
  arrange(RowLabels_temp, RowLabels_indexed) %>%
  mutate(RowLabels_indexed = ifelse(RowLabels_indexed==0, RowLabels_temp, RowLabels_indexed)) %>%
  rename(RowLabels=RowLabels_indexed) %>%
  data.frame()
df <- df %>% select(-RowLabels_temp)
df

输出

    col1  col2  col3  col4  col5  col6 RowLabels
1  411.4 439.0 437.3 436.9 420.7 516.9       610
2   86.4 113.9 103.5 113.5  80.3 129.0         1
3  102.1  99.5  96.3 100.4  99.5  86.0         2
4  109.7 102.2 100.2 112.9  92.3 123.8         3
5   88.9  87.1 103.6 102.5  93.6 134.1         4
6  -50.3 -40.2 -72.3 -61.4 -27.0 -22.7         5
7  -35.3  -9.3  25.3  -0.3  15.6 -27.3         6
8  109.9  85.8  80.7  69.3  66.4  94.0         7
9   88.1  96.3  99.6  92.0  90.0 137.6         8
...

答案 1 :(得分:0)

我不确定你的意思,但听起来你想使用match()函数。

例如:

target<-c(the values of your target order)
df<-df[match(target, df$column_to_reorder),]