使用for循环添加新变量,在R中添加if语句

时间:2016-04-24 23:23:41

标签: r

假设我有一个包含2个变量a和b的数据集,其中所有b都是a,但并非所有a都是b。

a<-rbind(1,1,1,1,1)
b<-rbind(0,0,0,1,1)
d<-cbind(a,b)
d
      [,1] [,2]
[1,]    1    0
[2,]    1    0
[3,]    1    0
[4,]    1    1
[5,]    1    1

我想创建一个新的第三个变量,将这些信息压缩成一个数据框。我尝试通过在nrows中写入1的循环来尝试这样做,如果a变量是1则写入2,如果b变量是1则写入1

e<- for (i in 1:nrow(d)) {
    if (d[,1]==1) {
        e$new[,i] <- 2
    } # end if 1
    else (d[,2]==1)
    e$new[,i]<-1
        } # end for 2

} # end for

我基本上希望输出看起来像这样:

> d
       [,1] [,2] [,3]
 [1,]    1    0    2
 [2,]    1    0    2
 [3,]    1    0    2
 [4,]    1    1    1
 [5,]    1    1    1

我一直收到错误:e $ new [,i]&lt; - 0错误:矩阵上的下标数不正确 另外:警告信息: 1:在1:x:数值表达式有2个元素:只使用第一个元素 2:在if(d [,1] == 1){:   条件的长度> 1,只使用第一个元素

任何有关调试脚本的帮助都将不胜感激!

1 个答案:

答案 0 :(得分:1)

为了简化操作,我将矩阵转换为数据框

a<-rbind(1,1,1,1,1)
b<-rbind(0,0,0,1,1)
d<-as.data.frame(cbind(a,b))

这使一些操作更容易(如果需要,您可以始终使用as.matrix(data_frame)将其转换回矩阵)

这是我提出的for循环

for(i in 1:nrow(d)){
    if((d[i,1] == 1 & d[i,2] == 0) == TRUE){
        d$V3[i] <- 2
    }else if((d[i,2] == 1) == TRUE){
        d$V3[i] <- 1
    }
}

我认为它发生的是你想要测试一个元素等于1的条件,但是你的操作返回一个向量。因此,我通过添加行和列下标并使其成为布尔值来略微改变条件。

实现预期结果的另一种可能性是以下列方式使用ifelse命令

##This is just to recreate the data frame
remove(list = ls())
a<-rbind(1,1,1,1,1)
b<-rbind(0,0,0,1,1)
d<-as.data.frame(cbind(a,b))
d$V3 <- ifelse(d$V1 == 1 & d$V2 == 0, 2,1)