簡體   English   中英

我如何使用R來遍歷兩個因素的水平

[英]How can I use R to loop over levels of two factors

我正在嘗試編寫一個因子變量以跟蹤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個元素的數值向量

我的問題是,如何使此循環結構起作用?

首先,您的現有代碼將在循環的每次迭代中替換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的新值factor1與上一年的值不同。 如果是這樣,它會在factor2后面附加一個1,否則它會附加一個0。

最后,對於此示例, factor2將是長度為25的向量。 但是,由於它是按ID順序填充的,因此不能僅將其添加到df ,而是需要首先對ID排序df ,然后將factor2作為新列添加到結果中。 希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM