如何使用R来循环两个因子的水平

时间:2014-03-28 16:50:35

标签: r for-loop conditional-statements

我正在尝试编码一个因子变量来跟踪R中另一个因子变量的年际变化。

假设我必须遵循数据结构:

df<-data.frame(id<-rep(seq(from=1,to=5,by=1),5), 
          year<-c(rep(2002,5), rep(2004,5), rep(2006,5), rep(2008, 5), 
                  rep(2010, 5)), factor<-rbinom(n=25,size=1,prob=0.5))

colnames(df)<-c("id", "year", "factor1")

df[,1]<-as.factor(as.character(df[,1]))

df[,2]<-as.factor(as.character(df[,2]))

df[,3]<-as.factor(as.character(df[,3]))

factor2<-c()

循环结构如下:

for(i in levels(df[,1])){
  for(j in levels(df[,2])){
    if(df[,3]>0){factor2<-1}
    else(factor2<-0)
  }
}

返回:

  

factor2作为具有0个元素的数字向量

我的问题是,我怎样才能让这个循环结构起作用?

1 个答案:

答案 0 :(得分:1)

首先,您的现有代码会在循环的每次迭代中替换factor2的内容。要在不指定索引的情况下添加新值,可以使用append()函数。但是,即使使用append(),您编写的代码也只会使factor2成为df[, 3]的副本。

我认为您想要做的是创建一个新因子,如果X年中的ID与上一年的ID不同,则设置为1。请尝试以下代码,替换factor2<-c()行并从那里继续:

factor2 <- vector()

for ( i in levels(df[, 1]) ) {

  dummy <- df[df$id==i, ]
  factor2 <- append(factor2, 0) 

  for ( j in 2:length(dummy[, 2]) ) {   

    if ( dummy[j, 3] != dummy[j-1, 3] ) {
      factor2 <- append(factor2, 1) 
    }

    else { 
      factor2 <- append(factor2, 0) 
    }

  }

}

此代码将{0}附加到factor2,因为ID在第一年永远不会有差异,因为没有上一年的比较。然后,对于每个后续年份,它会检查factor1的新值是否与上一年的值不同。如果是这样,它会将{1}附加到factor2,否则会附加一个0.

最后,对于此示例,factor2将是长度为25的向量。但是,由于它是按ID顺序填充的,因此您无法将其添加到df,而是需要先对ID​​ df进行排序,然后将factor2添加到结果中作为一个新专栏。希望这有帮助!