如何基于File_pdb列后缀重排R语言data.table的链相关字段
data.table链信息定向交换方案
需要根据File_pdb列末尾的两个字符(如6wps_AH中的AH),将对应第一个字符(A)的链数据(Res2/Pos2/Chain2)移到Res1/Pos1/Chain1列,原Res1/Pos1/Chain1的数据移到Res2/Pos2/Chain2列。要求方法通用,能自动识别并处理已符合要求和未符合要求的行。
原始数据
library(data.table) dt <- data.table::as.data.table(structure(list(File_pdb = c("6wps_AH", "6wps_AH", "6wps_AH", "6wps_AH", "6wps_AH", "6wps_AH", "6wps_AH", "6wps_AH", "6wps_AH", "6wps_AH", "6wps_AH", "6wps_AH", "6wps_AH", "6wps_AH", "6wps_AH", "6wps_AH"), Res1 = c("TRP", "GLU", "PHE", "SER", "ILE", "TYR", "GLY", "PHE", "LEU", "TRP", "PHE", "PRO", "ILE", "TRP", "ALA", "THR"), Pos1 = c("105", "108", "106", "109", "111", "100", "103", "106", "110", "105", "106", "28", "111", "105", "104", "30"), Chain1 = c("H", "H", "H", "H", "H", "H", "H", "H", "H", "H", "H", "H", "H", "H", "H", "H"), Res2 = c("CYS", "LYS", "LYS", "THR", "THR", "ASN", "GLU", "GLU", "GLU", "PRO", "PRO", "LEU", "ASN", "GLU", "GLU", "ASN"), Pos2 = c("361", "356", "356", "345", "345", "343", "340", "340", "340", "337", "337", "335", "343", "340", "340", "334"), Chain2 = c("A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A" )), row.names = c(NA, -16L), class = c("data.table", "data.frame" )))
解决方案代码
# 提取目标链:从File_pdb中截取末尾两个字符的第一个 dt[, target_chain := substr(File_pdb, nchar(File_pdb)-1, nchar(File_pdb)-1)] # 仅对Chain1不等于目标链的行执行列交换 dt[Chain1 != target_chain, `:=`( # 临时存储原Res1/Pos1/Chain1的值,防止覆盖丢失 temp_Res = Res1, temp_Pos = Pos1, temp_Chain = Chain1, # 将目标链数据移到Res1组列 Res1 = Res2, Pos1 = Pos2, Chain1 = Chain2, # 将原Res1组数据移到Res2组列 Res2 = temp_Res, Pos2 = temp_Pos, Chain2 = temp_Chain )][, c("temp_Res", "temp_Pos", "temp_Chain") := NULL] # 清理临时列 # 可选:删除目标链标记列 dt[, target_chain := NULL]
代码说明
- 提取目标链:通过
substr精准截取File_pdb的倒数第二个字符,得到需要前置的链标识。 - 条件交换:只对不符合要求的行(
Chain1不等于目标链)执行交换,已经符合要求的行保持不变。 - 临时变量过渡:用临时列存储原始数据,避免直接赋值时数据覆盖丢失。
- 清理冗余列:交换完成后删除临时列和目标链标记列,保持数据整洁。
处理后第一行的结果示例:
File_pdb Res1 Pos1 Chain1 Res2 Pos2 Chain2 6wps_AH CYS 361 A TRP 105 H
内容的提问来源于stack exchange,提问作者PersianK
相关产品推荐
相关产品推荐

