我有一个数据框架,它看起来像:
dataDemo <- data.frame(POS = 1:4 , REF = c("A" , "T" , "G" , "C") ,
ind1 = c("A" , "." , "G" , "C") , ind2 = c("A" , "C" , "C" , "."),
stringsAsFactors=FALSE)
dataDemo
POS REF ind1 ind2
1 1 A A A
2 2 T . C
3 3 G G C
4 4 C C .我想用该行的REF值替换所有的"."s。我就是这样做的:
for(i in seq_along(dataDemo$REF)){
dataDemo[i , ][dataDemo[i , ] == '.'] <- dataDemo$REF[i]
}我想知道在R中是否有一种更“恰当”或惯用的方法,我通常试着尽可能地使用*apply,这似乎可以很容易地适应这种方法,使它更易读懂(并且运行得更快),但尽管花了很多时间,我并没有取得多大的进展。
发布于 2016-06-20 17:39:20
下面是另一个base R替代方案,在这里我们使用"."出现的行号来用适当的REF值替换它们。
# Get row numbers
rownrs <- which(dataDemo==".", arr.ind = TRUE)[,1]
# Replace values
dataDemo[dataDemo=="."] <- dataDemo$REF[rownrs]
# Result
dataDemo
# POS REF ind1 ind2
#1 1 A A A
#2 2 T T C
#3 3 G G C
#4 4 C C C发布于 2016-06-20 17:43:00
在dplyr中,
library(dplyr)
dataDemo %>% mutate_each(funs(ifelse(. == '.', REF, as.character(.))), -POS)
# POS REF ind1 ind2
# 1 1 A A A
# 2 2 T T C
# 3 3 G G C
# 4 4 C C C发布于 2016-06-20 17:27:36
下面是使用来自set的data.table的一个选项,它应该是快速的。
library(data.table)
setDT(dataDemo)
nm1 <- paste0("ind", 1:2)
for(j in nm1){
i1 <- dataDemo[[j]]=="."
set(dataDemo, i = which(i1), j=j, value = dataDemo$REF[i1])
}
dataDemo
# POS REF ind1 ind2
#1: 1 A A A
#2: 2 T T C
#3: 3 G G C
#4: 4 C C C编辑:基于@alexis_laz的评论
或者使用dplyr
library(dplyr)
dataDemo %>%
mutate_each(funs(ifelse(.==".", REF,.)), ind1:ind2)
# POS REF ind1 ind2
#1 1 A A A
#2 2 T T C
#3 3 G G C
#4 4 C C C或者我们可以使用base R方法在一行中完成这一任务。
dataDemo[nm1] <- lapply(dataDemo[nm1], function(x) ifelse(x==".", dataDemo$REF, x))https://stackoverflow.com/questions/37928382
复制相似问题