【问题标题】:How can I use R to loop over levels of two factors如何使用 R 循环两个因素的水平
【发布时间】:2014-05-08 06:20:07
【问题描述】:

我正在尝试编写一个因子变量来跟踪 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 个元素的数值向量

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

【问题讨论】:

  • 您能否解释一下您认为您在该代码中的哪个位置创建了一个因子(甚至是数据框)?
  • > class(df[,1]) [1] "numeric" > df[,1] class(df [,1]) [1] “数字”
  • 您的代码中没有任何因素。如果你这样做了,那么在 cbinding 数据时,你会丢失它们。
  • 啊,所以实际上您没有在问题中包含所有相关代码。请编辑您的问题以解决此问题。
  • 您是否在寻找类似:factor2 &lt;- with(df,ifelse(as.numeric(as.character(factor1))&gt;0,1,0))

标签: r for-loop conditional-statements


【解决方案1】:

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

我相信您想要做的是创建一个新因子,如果 X 年的 ID 与前一年的 ID 不同,则该因子设置为 1。尝试以下代码,替换您的 factor2&lt;-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 作为新列添加到结果中。希望这会有所帮助!

【讨论】:

  • 有没有办法让这个响应更普遍?示例:如果每个唯一id没有出现在每一年(个人1输入了2006年的数据)
  • 最简单的方法是在内部循环中添加异常处理,如果 ID 为 NA,则将 NA 附加到 factor2。那只是另一个 if 语句。
猜你喜欢
  • 2018-07-05
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
  • 1970-01-01
  • 2021-02-21
  • 2019-06-27
  • 1970-01-01
  • 2019-03-18
相关资源
最近更新 更多