根据列中的值创建新行并为这些新行分配新值?
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 创建
我有一个数据框,其中包含 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 创建