首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按行替换的“‘Proper”方法

按行替换的“‘Proper”方法
EN

Stack Overflow用户
提问于 2016-06-20 17:24:37
回答 3查看 483关注 0票数 5

我有一个数据框架,它看起来像:

代码语言:javascript
复制
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。我就是这样做的:

代码语言:javascript
复制
for(i in seq_along(dataDemo$REF)){
    dataDemo[i , ][dataDemo[i , ] == '.'] <- dataDemo$REF[i]
}

我想知道在R中是否有一种更“恰当”或惯用的方法,我通常试着尽可能地使用*apply,这似乎可以很容易地适应这种方法,使它更易读懂(并且运行得更快),但尽管花了很多时间,我并没有取得多大的进展。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-06-20 17:39:20

下面是另一个base R替代方案,在这里我们使用"."出现的行号来用适当的REF值替换它们。

代码语言:javascript
复制
# 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
票数 7
EN

Stack Overflow用户

发布于 2016-06-20 17:43:00

dplyr中,

代码语言:javascript
复制
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
票数 9
EN

Stack Overflow用户

发布于 2016-06-20 17:27:36

下面是使用来自setdata.table的一个选项,它应该是快速的。

代码语言:javascript
复制
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

代码语言:javascript
复制
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方法在一行中完成这一任务。

代码语言:javascript
复制
dataDemo[nm1] <- lapply(dataDemo[nm1], function(x) ifelse(x==".",  dataDemo$REF, x))
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37928382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档