r - 根据 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
解决方案
使用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")
推荐阅读
- azure - terraform 模块依赖于 Azure
- nativescript - 动画后重置 Nativescript 高度
- java - DDD 和 Spring JPA
- server - Magento 服务器移动后,我得到 php_network_getaddresses: getaddrinfo failed: Name or service not known error on homepage
- django - Django 序列化程序显示所有要检索的字段,但从列表中隐藏字段
- css - 属于嵌套在另一个元素的类中的多个类的 div 元素的 CSS 样式规则
- reactjs - 如何从 Cloud Firestore 获取数据
- python - 无法绘制 Zipf 的分布图
- c# - Entity Framework Migrations 给出以下错误:context has changed since the database is created
- swift - 仅在新添加的单元格处重新加载 TableView