首页 > 解决方案 > 根据 R 中的一个列元素名称在数据框的其他列中创建一个元素

问题描述

我有一个包含 ce、si、ps、se 列的数据框。我必须根据各自的 si 列值在 ce、ps、se 列中创建一个元素。例如,如果 si 列的值为“SIRR”,则对应的 ce、ps、se 列值将分别为 Newce_SIRR_1、Newps_SIRR、Newse_SIRR_1。以下是供您参考的数据框

输入:

 ce         si          ps          se
 cedummy1  SIRR       psdummy     sedummy1
 cedummy2  SI234      psdummy     sedummy2
 cedummy   SI67K      psdummy     sedummy

预期输出:

ce              si          ps          se
Newce_SIRR_1     SIRR     Newps_SIRR    Newse_SIRR_1
Newce_SI234_2    SI234    Newps_SI234   Newse_SI234_2
Newce_SI67K_3    SI67K    Newps_SI67K   Newse_SI67K_3

列“si”的值应附加到所有其他列值,如上述数据框。对于列'ce'和'se',序列ID应该在最后。

createNewElement <- function(input, element, use_element_in_name, prefix, postfix_sep, include_si_name = FALSE)
{
    toappend <- input %>%
        mutate(rootname = ifelse(include_si_name, get("si"), if(use_element_in_name) get(element) else "")) %>%
        group_by(rootname) %>%
        mutate(idname = c(1:n())) %>%
        ungroup() %>%
        mutate(new_name = paste0(prefix, rootname, postfix_sep, idname))
        
        toappend %>%
        mutate(!!element := new_name) %>%
        select(-rootname, -idname, -new_name)   
}

  createNewElement(input, element = "ps", use_element_in_name = FALSE, prefix = "Newps_", postfix_sep = "", include_si_name = TRUE)
  createNewElement(input, element = "ce", use_element_in_name = FALSE, prefix = "Newce_", postfix_sep = "_", include_si_name = TRUE)
  createNewElement(input, element = "se", use_element_in_name = FALSE, prefix = "NewSe_", postfix_sep = "_", include_si_name = TRUE)

上面的代码没有按预期工作,它采用'si'的第一个值并附加到下面其他列中的所有行是我得到的结果

  ce              si          ps          se
Newce_SIRR_1    SIRR     Newps_SIRR    Newse_SIRR_1
Newce_SIRR_2    SI234    Newps_SIRR    Newse_SIRR_2
Newce_SIRR_3    SI67K    Newps_SIRR    Newse_SIRR_3

标签: r

解决方案


使用stringr::str_glue有一个优雅的解决方案:

library(tidyverse)

input %>% 
  mutate(ce = str_glue("Newce_{si}_{row_number()}"),
         ps = str_glue("Newps_{si}"),
         se = str_glue("Newse_{si}_{row_number()}"))

这使

  ce            si    ps          se           
  <glue>        <chr> <glue>      <glue>       
1 Newce_SIRR_1  SIRR  Newps_SIRR  Newse_SIRR_1 
2 Newce_SI234_2 SI234 Newps_SI234 Newse_SI234_2
3 Newce_SI67K_3 SI67K Newps_SI67K Newse_SI67K_3

输入数据:

input <-  read_table("ce         si          ps          se
cedummy1  SIRR       psdummy     sedummy1
cedummy2  SI234      psdummy     sedummy2
cedummy   SI67K      psdummy     sedummy")

推荐阅读