有沒有一個真正的問題,但我會猜它是什麼:
我怎麼能代替的HapA
和值210遵循以下規則:
- 如果
"0"
,則替換爲值REF
。
- 如果
"1"
,則用值替換。
- 如果
"."
,則替換爲NA
。
請注意,我也假設HapA
和HapB
是字符列,因爲.
不能是一個數值。
如果這是正確的解釋,沒有必要使用花哨的技巧。這是一個「if-else」問題。這是一個使用data.table
的解決方案,我認爲這在基因組分析中很常見。首先,我將創建示例數據集:
library(data.table)
dt <- fread(
header = TRUE,
colClasses = c(
Chrom = "character",
POS = "integer",
ID = "character",
REF = "character",
ALT = "character",
HapA = "character",
HapB = "character"
),
input = "
Chrom POS ID REF ALT HapA HapB
22 16495833 'rs116911124' 'A' 'C' 1 0
22 19873357 'rs116378360' 'T' 'A' 0 1
22 21416404 'rs117982183' 'T' 'T' 0 ."
)
dt
# Chrom POS ID REF ALT HapA HapB
# 1: 22 16495833 'rs116911124' 'A' 'C' 1 0
# 2: 22 19873357 'rs116378360' 'T' 'A' 0 1
# 3: 22 21416404 'rs117982183' 'T' 'T' 0 .
這是很長的一部分。這是簡短的部分。
dt[HapA == "0", HapA := REF]
dt[HapA == "1", HapA := ALT]
dt[HapA == ".", HapA := NA]
dt[HapB == "0", HapB := REF]
dt[HapB == "1", HapB := ALT]
dt[HapB == ".", HapB := NA]
dt
# Chrom POS ID REF ALT HapA HapB
# 1: 22 16495833 'rs116911124' 'A' 'C' 'C' 'A'
# 2: 22 19873357 'rs116378360' 'T' 'A' 'T' 'A'
# 3: 22 21416404 'rs117982183' 'T' 'T' 'T' NA
我強烈建議以簡單的方式寫了這一點,像上面。它很短,幾乎沒有重複,並且一目瞭然便於理解。但是,如果您想將其推廣到很多列,那就需要編寫大量的重複行。所以這裏是一個循環版本:
replaced_columns <- c("HapA", "HapB") # Switch these out for any
source_columns <- c("REF", "ALT") # number of columns
for (rr in replaced_columns) {
for (source_i in seq_along(source_columns)) {
target_rows <- which(dt[[rr]] == source_i - 1)
dt[
target_rows,
(rr) := .SD,
.SDcols = source_columns[source_i]
]
}
}
dt
# Chrom POS ID REF ALT HapA HapB
# 1: 22 16495833 'rs116911124' 'A' 'C' 'C' 'A'
# 2: 22 19873357 'rs116378360' 'T' 'A' 'T' 'A'
# 3: 22 21416404 'rs117982183' 'T' 'T' 'T' .
它是否總是相同的規則0將被'REF'列和1替換爲'ALT'列(並且由NA)? –
所以'HapA'和'HapB'都是字符列?它們不是數字或整數,因爲'.'對於這些不是有效的值。 –
@SRivero嗨,是的這是總是相同的規則,0將被替換爲REF列和1 ALT列 –