我正在尝试编码一个因子变量来跟踪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个元素的数字向量
我的问题是,我怎样才能让这个循环结构起作用?
答案 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
添加到结果中作为一个新专栏。希望这有帮助!