r语言 - 按名称合并多对列



我不知道该如何处理这个问题:

我有来自癌症治疗的测量数据框,我想使用coalesce()成对地"合并"。但是框架包含100多个列,所以我想使用某种函数或循环。

这是我的dataframe的样子

dataframe

我有一个包含治疗名称的向量:drugs <- c(a, c, B, D等)

列表示药物治疗的多个测量值。我想成对合并列:A_1 + A_2成A(新列),B_1等

代码如下:df <- df %>% mutate(A = coalesce(A_1, A_2).

但是框架有100多个列,所以我想使用某种函数或循环,使用带有药物名的向量的值。每种药物有2列,但它们的顺序不对,所以我不能使用编号,我只能使用列名。但是当我把它放入一个函数时它不起作用

一个补充:我想有结果列(A,B,C)等添加到框架。

我该怎么做?

谢谢! !

这是split.default的一个选项-根据列名模式将数据分割成数据块,然后通过循环list

使用coalesce
library(dplyr)
library(stringr)
library(purrr)
df1 %>% 
split.default(str_remove(names(.), "\d+$")) %>%
map_dfc(~ exec(coalesce, !!!.x))

与产出

# A tibble: 5 × 3
A     B     C
<dbl> <dbl> <dbl>
1     1     6     2
2     5     5     1
3     3     3     3
4     1     6     3
5    10     8     5

数据
df1 <- structure(list(A1 = c(1, 5, NA, 1, 10), B1 = c(NA, 5, 3, 6, 8
), C1 = c(2, NA, NA, 3, 5), A2 = c(1, 2, 3, 4, 5), C2 = c(0, 
1, 3, 2, NA), B2 = c(6, NA, 7, NA, NA)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -5L))

更新后缀_ViMIC_EtMIC:

library(tidyverse)
old_df <- tribble(
~A_EtMIC, ~B_EtMIC, ~C_EtMIC, ~A_ViMIC, ~C_ViMIC, ~B_ViMIC,
1, NA, 2, 1, 0, 6,
5, 5, NA, 2, 1, NA,
NA, 3, NA, 3, 3, 7,
1, 6, 3, 4, 2, NA,
10, 8, 5, 5, NA, NA
) 
new_df <- old_df |> 
mutate(row = row_number()) |> 
pivot_longer(-row, names_to = c("prefix", "suffix"), 
names_pattern = "(.*)_(..MIC)") |> 
pivot_wider(names_from = suffix, 
values_from = value) |> 
mutate(coalesced = coalesce(EtMIC, ViMIC)) |> 
select(- ends_with("MIC")) |> 
pivot_wider(names_from = prefix, values_from = coalesced,
names_glue = "{prefix}_MIC")
both_df <- bind_cols(new_df, old_df)
both_df
#> # A tibble: 5 × 10
#>     row A_MIC B_MIC C_MIC A_EtMIC B_EtMIC C_EtMIC A_ViMIC C_ViMIC B_ViMIC
#>   <int> <dbl> <dbl> <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
#> 1     1     1     6     2       1      NA       2       1       0       6
#> 2     2     5     5     1       5       5      NA       2       1      NA
#> 3     3     3     3     3      NA       3      NA       3       3       7
#> 4     4     1     6     3       1       6       3       4       2      NA
#> 5     5    10     8     5      10       8       5       5      NA      NA

由reprex包(v2.0.1)创建于2022-06-05

最新更新