[英]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.