R 替换数据框中索引列中的值
我有一个如下所示的数据矩阵:R 替换数据框中索引列中的值,r,R,我有一个如下所示的数据矩阵: > taxmat = matrix(sample(letters, 70, replace = TRUE), nrow = 10, ncol = 7) > rownames(taxmat) <- paste0("OTU", 1:nrow(taxmat)) > taxmat<-cbind(taxmat,c("Genus","Genus","Genus","Family","Family","Order","Genus","Species"
> taxmat = matrix(sample(letters, 70, replace = TRUE), nrow = 10, ncol = 7)
> rownames(taxmat) <- paste0("OTU", 1:nrow(taxmat))
> taxmat<-cbind(taxmat,c("Genus","Genus","Genus","Family","Family","Order","Genus","Species","Genus","Species"))
> colnames(taxmat) <- c("Domain", "Phylum", "Class", "Order", "Family", "Genus", "Species", "Lowest")
> taxmat
Domain Phylum Class Order Family Genus Species Lowest
OTU1 "h" "c" "q" "e" "q" "w" "v" "Genus"
OTU2 "f" "y" "q" "z" "p" "w" "v" "Genus"
OTU3 "w" "q" "i" "i" "z" "j" "f" "Genus"
OTU4 "c" "e" "f" "n" "z" "b" "d" "Family"
OTU5 "g" "w" "q" "k" "e" "x" "k" "Family"
OTU6 "x" "j" "l" "w" "z" "o" "q" "Order"
OTU7 "k" "s" "j" "y" "t" "a" "t" "Genus"
OTU8 "w" "u" "s" "w" "g" "y" "n" "Species"
OTU9 "t" "r" "t" "o" "i" "l" "z" "Genus"
OTU10 "x" "p" "j" "f" "k" "q" "w" "Species"
我可以将所有索引替换为向量
idx<-lapply(tax$Lowest, grep, colnames(tax))
idx <- as.numeric(unlist(idx))+1
idx我们可以通过apply
对行进行循环,并通过match
将列的名称
与最后一个元素的名称(即“lower”中的元素)匹配来创建逻辑索引,即将行的值替换为“unknown”
t(apply(m1, 1, function(x) {
i1 <- match( x[8], names(x)[-8])+1
i1[i1>7] <- 0
i1 <- if(i1!=0) i1:7 else i1
c(replace(x[-8], i1, "unknown"), x[8])}))
# Domain Phylum Class Order Family Genus Species Lowest
#OTU1 "b" "b" "v" "v" "l" "n" "unknown" "Genus"
#OTU2 "l" "m" "w" "b" "f" "y" "unknown" "Genus"
#OTU3 "h" "w" "n" "y" "k" "f" "unknown" "Genus"
#OTU4 "u" "m" "p" "n" "t" "unknown" "unknown" "Family"
#OTU5 "o" "b" "q" "w" "a" "unknown" "unknown" "Family"
#OTU6 "s" "j" "l" "d" "unknown" "unknown" "unknown" "Order"
#OTU7 "v" "y" "t" "p" "s" "v" "unknown" "Genus"
#OTU8 "b" "r" "k" "d" "q" "c" "q" "Species"
#OTU9 "k" "h" "b" "w" "h" "x" "unknown" "Genus"
#OTU10 "o" "p" "b" "n" "k" "d" "q" "Species"
lst <- Map(function(x, y) if(x >y) 0 else x:y, match(m1[,8], colnames(m1)[-8])+1, 7)
m1[cbind(rep(seq_len(nrow(m1)), lengths(lst)), unlist(lst))] <- "unknown"
我想,从打印出来的方式来看,这不是一个数据帧。你可能想读一读《重新制作一个可复制的例子》。
lst <- Map(function(x, y) if(x >y) 0 else x:y, match(m1[,8], colnames(m1)[-8])+1, 7)
m1[cbind(rep(seq_len(nrow(m1)), lengths(lst)), unlist(lst))] <- "unknown"