如何在R数据框每行后添加含反转is_severe的自定义新行?
解决R数据框按规则添加新行的问题
原始数据
先定义你的原始数据框:
df <- data.frame( X = c(0, 2), snp_id = c("GL000191.1-37698", "GL000191.1-37922"), is_severe = c(0, 1), encoding_1 = c(0, 1), encoding_2 = c(1, 0), encoding_0 = c(7, 12) )
解决方案
提供两种实现方式,按需选择:
方法一:Base R 实现
# 构造新行数据框 new_rows <- df[, c("X", "snp_id")] new_rows$is_severe <- abs(df$is_severe - 1) # 快速实现0和1取反 new_rows$encoding_1 <- 0 new_rows$encoding_2 <- 0 new_rows$encoding_0 <- ifelse(new_rows$is_severe == 0, 8, 13) # 合并原始行与新行,按原始顺序排列后重置X序号 result <- rbind(df, new_rows)[order(df$X), ] result$X <- seq(nrow(result)) # 查看结果 print(result)
方法二:dplyr(Tidyverse)实现
如果习惯使用tidyverse工具链,可使用以下代码:
library(dplyr) result <- df %>% rowwise() %>% group_map(~ { # 构造当前行对应的新行 new_row <- tibble( X = .x$X, snp_id = .x$snp_id, is_severe = abs(.x$is_severe - 1), encoding_1 = 0, encoding_2 = 0, encoding_0 = ifelse(abs(.x$is_severe - 1) == 0, 8, 13) ) # 合并当前行与新行 bind_rows(.x, new_row) }) %>% bind_rows() %>% # 重置X为连续序号 mutate(X = row_number()) # 查看结果 print(result)
最终输出
两种方法都会得到符合需求的结果:
X snp_id is_severe encoding_1 encoding_2 encoding_0 1 1 GL000191.1-37698 0 0 1 7 2 2 GL000191.1-37698 1 0 0 13 3 3 GL000191.1-37922 1 1 0 12 4 4 GL000191.1-37922 0 0 0 8
内容的提问来源于stack exchange,提问作者Eliza Romanski
相关产品推荐
相关产品推荐

