根据列中的值创建新行并为这些新行分配新值?

Create new rows based on values in a column and assign these new rows a new value?

我有一个数据框,其中包含 25 个变量的 732 个独特观察值。我想做的是,假设参考和加入 MeSH ID 不同,在下面创建新行,我将参考 ID 移动到与加入 MeSH ID 相同的列,删除参考 MeSH ID 列并分配 LinScore 1 到包含参考 MeSH ID 的新行。因此,如果 table 中的一行当前看起来像这样:

疾病 Joining.Mesh.ID 公司 农业部 Reference.MeSH.ID LinScore
急性髓性白血病 D015470 葛兰素史克 VGF-B 激动剂 D007951 0.9625

我希望最终产品看起来像这样:

疾病 网格ID 公司 作用方式 LinScore
急性髓性白血病 D015470 葛兰素史克 VGF-B 激动剂 0.9625
急性髓性白血病 D007951 葛兰素史克 VGF-B 激动剂 1

我之前问过一个与此相关的问题,并且有一些代码可以在 dplyr 中使用 pivot_longer() 创建新行,但我不知道如何将 1 的 LinScore 分配给这些新行。

一如既往,如果有任何建议,我将不胜感激!

您可以 pivot_longer 包含 ID 的列,然后使用 if_else 将参考行的 LinScore 设置为 1

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(tidyr)

df <- structure(list(Disease = "Acute Myeloid Leukemia", Joining.Mesh.ID = "D015470", 
                     Company = "GSK", MoA = "VGF-B agonist", Reference.MeSH.ID = "D007951", 
                     LinScore = 0.9625), row.names = c(NA, -1L), class = "data.frame")

df %>% 
  pivot_longer(cols = ends_with('.ID'),
                values_to = 'mesh_id') %>% 
  relocate(mesh_id, .after = Disease) %>%
  mutate(LinScore = if_else(grepl('Reference', name), 1, LinScore)) %>% 
  select(-name) 
#> # A tibble: 2 x 5
#>   Disease                mesh_id Company MoA           LinScore
#>   <chr>                  <chr>   <chr>   <chr>            <dbl>
#> 1 Acute Myeloid Leukemia D015470 GSK     VGF-B agonist    0.962
#> 2 Acute Myeloid Leukemia D007951 GSK     VGF-B agonist    1

reprex package (v2.0.0)

于 2021-07-13 创建