R函数循环

时间:2019-01-21 05:31:38

标签: r

嗨,我有一个3列的数据框df,如下所示:

 a    b    c
-2    A    G
 1    G    C
 3    T    C
-4    A    G

我想创建一个新列d,如果b中的值为负,则采用a中的值,如果为正,则采用c的值:

 a     b     c    d
-2     A     G    A
 1     G     C    C
 3     T     C    C
-4     A     G    A

我写了一些类似这样的函数,但是它不起作用

select_allele<-function(x,y){ 
  for(i in 1:nrow(df)){   
    if(df$a[i] > 0){
      df$d[i] <- return(y)   
    } else {
      df$d[i] <- return(x)   
    } 
}} 

mapply(select_allele, x=df$b, y=df$c)

任何帮助都受到赞赏。

2 个答案:

答案 0 :(得分:4)

有多种方法可以做到这一点。一种使用sign函数的方法,该函数返回数字的sign

df$d <- with(df, ifelse(sign(a) == -1, b, c))
df

#   a b c d
#1 -2 A G A
#2  1 G C C
#3  3 T C C
#4 -4 A G A

或与dplyr if_else

library(dplyr)
df %>% mutate(d = if_else(a < 0, b, c))

数据

df <- structure(list(a = c(-2L, 1L, 3L, -4L), b = c("A", "G", "T", 
"A"), c = c("G", "C", "C", "G")), .Names = c("a", "b", "c"), row.names = c(NA, 
-4L), class = "data.frame")

答案 1 :(得分:3)

假设在创建df时,您在stringsAsFactors = FALSE中设置了data.frame()

df$d <-ifelse(df$a>0,df$c,df$b)

#   a b c d
#1 -2 A G A
#2  1 G C C
#3  3 T C C
#4 -4 A G A