根据列中的值创建新行?
creating new rows based on values in a column?
我有一个包含 717 行的数据框,我现在要做的是,假设引用和加入 MeSH ID 不同,在下面创建新行,我将引用 ID 移动到与加入相同的列中MeSH ID,像我一样删除参考 MeSH ID 列,但保持行中的所有其他数据相同。因此,如果 table 中的一行当前看起来像这样:
疾病
加入网格ID
公司
作用方式
参考 MeSH ID
急性髓性白血病
D015470
吉利德
CD3 激动剂
D007951
我希望最终产品看起来像这样:
疾病
网格 ID
公司
作用方式
急性髓性白血病
D015470
吉利德
CD3 激动剂
急性髓性白血病
D007951
吉利德
CD3 激动剂
(总共有25列,为了简单起见,我只展示了其中的几列。)
一如既往,非常感谢您的帮助!
df <- read.table(header = T, text = "Disease Joining_Mesh_ID Company Mode_of_Action Reference_MeSH_ID
'Acute Myeloid Leukemia' D015470 Gilead 'CD3 agonist' D007951")
library(tidyverse)
df %>% pivot_longer(ends_with('_ID'), names_to = NULL, values_to = 'Mesh_ID')
#> # A tibble: 2 x 4
#> Disease Company Mode_of_Action Mesh_ID
#> <chr> <chr> <chr> <chr>
#> 1 Acute Myeloid Leukemia Gilead CD3 agonist D015470
#> 2 Acute Myeloid Leukemia Gilead CD3 agonist D007951
由 reprex package (v2.0.0)
于 2021-07-04 创建
我想这就是你需要的:
library(tidverse)
dat %>%
tidyr::pivot_longer(-c(Disease, Company, Mode.of.Action), values_to="Mesh ID", names_to = NULL)
# A tibble: 2 x 4
Disease Company Mode.of.Action `Mesh ID`
<chr> <chr> <chr> <chr>
1 Acute Myeloid Leukemia Gilead CD3 agonist D015470
2 Acute Myeloid Leukemia Gilead CD3 agonist D007951
您也可以使用以下解决方案:
library(tidyr)
library(stringr)
DF %>%
rename_with(~ str_to_title(.x), contains("ID")) %>%
pivot_longer(!c(Disease, Company, `Mode of Action`), names_to = c(NA, ".value"),
names_pattern = "(\w+)\s(.*)")
# A tibble: 2 x 4
Disease Company `Mode of Action` `Mesh Id`
<chr> <chr> <chr> <chr>
1 Acute Myeloid Leukemia Gilead CD3 agonist D015470
2 Acute Myeloid Leukemia Gilead CD3 agonist D007951
我有一个包含 717 行的数据框,我现在要做的是,假设引用和加入 MeSH ID 不同,在下面创建新行,我将引用 ID 移动到与加入相同的列中MeSH ID,像我一样删除参考 MeSH ID 列,但保持行中的所有其他数据相同。因此,如果 table 中的一行当前看起来像这样:
疾病 | 加入网格ID | 公司 | 作用方式 | 参考 MeSH ID |
---|---|---|---|---|
急性髓性白血病 | D015470 | 吉利德 | CD3 激动剂 | D007951 |
我希望最终产品看起来像这样:
疾病 | 网格 ID | 公司 | 作用方式 | |
---|---|---|---|---|
急性髓性白血病 | D015470 | 吉利德 | CD3 激动剂 | |
急性髓性白血病 | D007951 | 吉利德 | CD3 激动剂 |
(总共有25列,为了简单起见,我只展示了其中的几列。)
一如既往,非常感谢您的帮助!
df <- read.table(header = T, text = "Disease Joining_Mesh_ID Company Mode_of_Action Reference_MeSH_ID
'Acute Myeloid Leukemia' D015470 Gilead 'CD3 agonist' D007951")
library(tidyverse)
df %>% pivot_longer(ends_with('_ID'), names_to = NULL, values_to = 'Mesh_ID')
#> # A tibble: 2 x 4
#> Disease Company Mode_of_Action Mesh_ID
#> <chr> <chr> <chr> <chr>
#> 1 Acute Myeloid Leukemia Gilead CD3 agonist D015470
#> 2 Acute Myeloid Leukemia Gilead CD3 agonist D007951
由 reprex package (v2.0.0)
于 2021-07-04 创建我想这就是你需要的:
library(tidverse)
dat %>%
tidyr::pivot_longer(-c(Disease, Company, Mode.of.Action), values_to="Mesh ID", names_to = NULL)
# A tibble: 2 x 4
Disease Company Mode.of.Action `Mesh ID`
<chr> <chr> <chr> <chr>
1 Acute Myeloid Leukemia Gilead CD3 agonist D015470
2 Acute Myeloid Leukemia Gilead CD3 agonist D007951
您也可以使用以下解决方案:
library(tidyr)
library(stringr)
DF %>%
rename_with(~ str_to_title(.x), contains("ID")) %>%
pivot_longer(!c(Disease, Company, `Mode of Action`), names_to = c(NA, ".value"),
names_pattern = "(\w+)\s(.*)")
# A tibble: 2 x 4
Disease Company `Mode of Action` `Mesh Id`
<chr> <chr> <chr> <chr>
1 Acute Myeloid Leukemia Gilead CD3 agonist D015470
2 Acute Myeloid Leukemia Gilead CD3 agonist D007951