假设我有一个包含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,只使用第一个元素
任何有关调试脚本的帮助都将不胜感激!
答案 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)