0

我有以下数据框:

id1 id2 qtty    cat output
15994   15994   30  1   1
25787   26275   7   2   1
122301  122301  0   0   0
36199   35333   14  2   1
36199   36199   15  1   1
46223   45746   14  2   1
46223   46223   15  1   1
80570   80570   0   0   0
55728   55728   1   1   1
94218   94218   0   0   0
69456   66837   5   2   1

cat我要根据以下条件生成的列在哪里:

id1=id2 and qtty=0 then cat=0
id1=id2 and qtty>0 then cat=1
id1!=id2 and qtty=0 then cat=2
id1!=id2 and qtty>0 then cat=2

output是我得到的,我所做的是:

  status<-function(dataframe){
  store<-rep(0,length(dataframe[,1]))
  for(i in 1: length(dataframe[,1])) {
    if(dataframe[i,1]==dataframe[i,2]) {
      if(dataframe[i,3]==0) {store[i]<-0}
        else
          if(dataframe[i,1]==dataframe[i,2]) {
            if(dataframe[i,3]>0) {store[i]<-1}
              else
                if(dataframe[i,1]!=dataframe[i,2]) {
                  if(dataframe[i,3]>0) {store[i]<-2}
                    else store[i]<-2
               }
            }
         }
     }
  return(store)
}

任何帮助将不胜感激。

4

1 回答 1

5

这可以通过ifelse:(假设dat是您的数据框)来完成

within(dat, cat <- ifelse(id1 != id2, 2, qtty > 0))

结果:

      id1    id2 qtty cat output
1   15994  15994   30   1      1
2   25787  26275    7   2      1
3  122301 122301    0   0      0
4   36199  35333   14   2      1
5   36199  36199   15   1      1
6   46223  45746   14   2      1
7   46223  46223   15   1      1
8   80570  80570    0   0      0
9   55728  55728    1   1      1
10  94218  94218    0   0      0
11  69456  66837    5   2      1

这个怎么运作:

该函数ifelse检查id1id2是否相同。如果是这种情况,则将该值2分配给 中的相应条目cat。如果它们不相同,qtty > 0则分配结果。后者返回一个布尔值 ( FALSEand TRUE) 的逻辑向量,这些值被转换为整数 ( 0and 1)。

于 2012-12-18T11:54:53.653 回答