注意此答案最初是为了解决How to replace all values in data frame with a vector of values? 中发布的更简单的问题。不幸的是,这个问题作为实际问题的重复而被关闭。因此,我将尝试在这两种情况下基于替换因子水平提出解决方案。
如果只有一个向量(或一个数据框列)
其值需要替换并且没有反对使用因子我们可以将向量强制转换为因子并根据需要更改因子水平:
x <- c(1, 1, 4, 4, 5, 5, 1, 1, 2)
x <- factor(x)
x
#[1] 1 1 4 4 5 5 1 1 2
#Levels: 1 2 4 5
replacement_vec <- c("A", "T", "C", "G")
levels(x) <- replacement_vec
x
#[1] A A C C G G A A T
#Levels: A T C G
使用forcatspackage 可以一次性完成:
x <- c(1, 1, 4, 4, 5, 5, 1, 1, 2)
forcats::lvls_revalue(factor(x), replacement_vec)
#[1] A A C C G G A A T
#Levels: A T C G
如果需要替换数据框多列的所有值,可以扩展该方法。
foo <- data.frame(snp1 = c("AA", "AG", "AA", "AA"),
snp2 = c("AA", "AT", "AG", "AA"),
snp3 = c(NA, "GG", "GG", "GC"),
stringsAsFactors=FALSE)
level_vec <- c("AA", "AC", "AG", "AT", "GC", "GG")
replacement_vec <- c("0101", "0102", "0103", "0104", "0302", "0303")
foo[] <- lapply(foo, function(x) forcats::lvls_revalue(factor(x, levels = level_vec),
replacement_vec))
foo
# snp1 snp2 snp3
#1 0101 0101 <NA>
#2 0103 0104 0303
#3 0101 0103 0303
#4 0101 0101 0302
注意level_vec 和replacement_vec 的长度必须相等。
更重要的是,level_vec 应该是 complete ,即在原始数据框的受影响列中包含所有可能的值。 (使用unique(sort(unlist(foo))) 进行验证)。否则,任何缺失值都将被强制转换为<NA>。请注意,这也是Martin Morgans's answer 的要求。
因此,如果只有几个不同的值需要替换,那么使用其他答案之一可能会更好,例如,Ramnath's。