根据列中的值创建新行?

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