将冗余行名称(变量)作为列并在 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
下面是我如何使用 tidyr
和 dplyr
包:
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
我有这种格式的数据 - 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
下面是我如何使用 tidyr
和 dplyr
包:
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