将冗余行名称(变量)作为列并在 R 中的 csv 文件中重新排列所需数据

Making redundant rows names (variables) as columns and rearranging the required data in a csv file in R

我有这种格式的数据 - Source Data

我想按照以下格式重新排列我的数据 -

UNIQUE-ID       TYPES      COMMON-NAME       CHEMICAL-FORMULA           DBLINKS                           MOLECULAR-WEIGHT     MONOISOTOPIC-MW
PYRIDINE-RING   Rings     pyridine-ring       (C 5)(H 5)(N 1)            NA                               79.101               NA
STEARIC_ACID    Even-St.. stearate            (C 18)(H 35)(O 2)   (BIGG "37799")..;(CHEMSPIDER "..);      283.473              284.2715304
BETA-HYDROX..  Compounds  3-β-hydro..    (C 19)(H 29)(O...   (CHEBI "1724"..);(PUBCHEM "2520..);     369.495              370.1813984
OXALACETIC_A.. Compounds    ...                ....                ....                                   ....                 ...
....             ....       ...
....             ....       ...

所以我想根据"UNIQUE-ID"、"TYPES"、"COMMON-NAME"、"CHEMICAL-FORMULA"、"MOLECULAR-WEIGHT"和"MONOISOTOPIC-MW"排列数据。我的代码应该将与同一 id 值关联的行视为一行,并在新数据框中重新排列该信息——例如,原始 csv 文件中 id 为“1”的每一行都应重写为一行我上面提到的格式。

现在数据的问题是,对于某些 "UNIQUE-ID",有几个 "TYPES"(2 个、3 个或在某些情况下为 5 个),我希望它们用分号分隔(;) 在我的输出数据的单个单元格中,就像我在上面 table 中提到的那样(例如,参见 "DBLINKS" 列)

其他信息:-

从"DBLINKS"列中我想获取的主要信息只有"BIGG ID no."、"CHEMSPIDER ID no."、"CAS ID no."、"PUBCHEM ID no."和"CHEBI ID no." 但如果实施起来如此复杂,我会在稍后解决。

我不确定,但我正在考虑为此使用 R 中的重塑函数,但不确定在我的特定情况下参数的使用。

我们真诚地感谢任何帮助实现预期结果的帮助。非常感谢。

Link 到示例数据文件 - Sample Data

编辑:进一步说明:-

我希望我的最终输出是这样的(为了简单易懂,示例是虚构的虚拟数据而不是实际数据)-

UNIQUE-ID    TYPES       COMMON-NAME    CHEMICAL-FORMULA       DBLINKS                       MOLECULAR-WEIGHT    MONOISOTOPIC-MW

ID-1          A           C-Name-1      (C 5)(H 5)(N 1)        Detail-1                          79.101            NA   
ID-2          B; C; D     C-Name-2      (C 18)(H 35)(O 2)      Detail-2; Detail-3                283.473          284.27    
ID-3          E; F        C-Name-3      (C 19)(H 29)(O 5)(S 1) Detail-2; Detail-1; Detail-5      369.495          370.18

来自我现在拥有的以下数据格式(csv 文件)。源数据看起来像这样 -

Variable         Content       Id
UNIQUE-ID         ID-1          1
TYPES             A             1
COMMON-NAME       C-Name-1      1
CHEMICAL-FORMULA  (C 5)         1
CHEMICAL-FORMULA  (H 5)         1
CHEMICAL-FORMULA  (N 1)         1
DBLINKS           Detail-1      1
MOLECULAR-WEIGHT  79.101        1
UNIQUE-ID         ID-2          2
TYPES             B             2
TYPES             C             2
TYPES             D             2
COMMON-NAME       C-Name-2      2
CHEMICAL-FORMULA  (C 18)        2
CHEMICAL-FORMULA  (H 35)        2
CHEMICAL-FORMULA  (O 2)         2
DBLINKS           Detail-2      2
DBLINKS           Detail-3      2
MOLECULAR-WEIGHT  283.473       2
MONOISOTOPIC-MW   284.27        2
UNIQUE-ID         ID-3          3
TYPES             E             3
TYPES             F             3
COMMON-NAME       C-Name-3      3
CHEMICAL-FORMULA  (C 19)        3           
CHEMICAL-FORMULA  (H 29)        3
CHEMICAL-FORMULA  (O 5)         3
CHEMICAL-FORMULA  (S 1)         3
DBLINKS           Detail-2      3
DBLINKS           Detail-1      3
DBLINKS           Detail-5      3
MOLECULAR-WEIGHT  369.495       3
MONOISOTOPIC-MW   370.18        3

下面是我如何使用 tidyrdplyr 包:

library(tidyr)
library(dplyr)
df <- read.table("test.txt", header = T) 

df2 <- df %>% group_by(Variable, Id) %>% 
  summarise(Content2 = paste(Content, collapse = ";")) %>% 
  spread(key = Variable, value = Content2) %>% 
  select("UNIQUE-ID", TYPES, "COMMON-NAME", "CHEMICAL-FORMULA", DBLINKS, 
         "MOLECULAR-WEIGHT", "MONOISOTOPIC-MW")

df2
# A tibble: 3 x 7
  `UNIQUE-ID` TYPES `COMMON-NAME` `CHEMICAL-FORMULA`    DBLINKS            `MOLECULAR-WEIGH~ `MONOISOTOPIC-M~
  <chr>       <chr> <chr>         <chr>                 <chr>              <chr>             <chr>           
1 ID-1        A     C-Name-1      (C5);(H5);(N1)        Detail-1           79.101            NA              
2 ID-2        B;C;D C-Name-2      (C18);(H35);(O2)      Detail-2;Detail-3  283.473           284.27          
3 ID-3        E;F   C-Name-3      (C19);(H29);(O5);(S1) Detail-2;Detail-1~ 369.495           370.18

如果您想详细了解此处使用的每个函数,请查看 R for Data Science