嗨,我有一个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)
任何帮助都受到赞赏。
答案 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