R - Expand.grid +合并丢失因子水平顺序

时间:2016-01-14 13:28:04

标签: r

以下问题发生在闪亮的应用程序中,涉及的数据是多个子集和修改的产物。因此很难获得可重现的数据集来添加到此请求中(我无法在闪亮的块中设置dput())。我的请求似乎是一个逻辑问题,所以我会先尝试而不添加数据。

我有一个带有3列的DF0: 年:因素, SP:因素, IA:数字。

我使用SP的级别对其进行子集化,称为DF1,但在此过程中会丢失一些YEAR级别。

我的代码使用expand.grid在子集中找到未使用的YEAR级别,然后将空缺少的行合并到子集中。目的是在缺失年份的IA上设置“0”作为值,并具有完整的时间系列。我通过在原始数据集DF中请求获得了YEAR的所有级别。

Asynctask.onPostExecute

基本上我合并具有相同结构的DF1和DF2:

DF1:

AGG<-reactive({
  DF2 <- with(DF1(), expand.grid(YEAR = levels(DF()$YEAR),SP = levels(DF0()$SP)))
  DF2 <- merge(DF1(), DF2,by=c("YEAR", "SP"), all = TRUE)
  DF2$IA[is.na(DF2$IA)] <- 0
  DF2<-data.table(DF2)
})

DF2:

 $ YEAR: Factor w/ 6 levels "2006","2007",..: 1 2 3 4 5 6
 $ SP  : Factor w/ 1 level "Aglais io (Linnaeus, 1758)": 1 1 1 1 1 1
 $ IA  : num  82.3 78.8 79.3 135.4 81.8 ...

这两个数据集实际上是合并的,但在这个过程中,我的YEAR级别会松开它们的顺序。

DF2

$ YEAR: Factor w/ 14 levels "2006","2007",..: 1 2 3 4 5 6 7 8 9 10 ...
$ SP  : Factor w/ 1 level "Aglais io (Linnaeus, 1758)": 1 1 1 1 1 1 1 1 1 1  ...
 $ IA  : num  82.3 78.8 79.3 135.4 81.8 ...
 - attr(*, ".internal.selfref")=<externalptr> 

我尝试在多个SO帖子之后使用order()和sort()重新排序DF2 $ YEAR,但没有一个对此有影响。在应用程序中自动找到YEAR级别,因此我无法手动设置订单。

我的最终情节没有任何意义! (所有0年都恢复) enter image description here

我应该如何恢复(或永不松散)我的要素订单?

1 个答案:

答案 0 :(得分:0)

您可以通过

手动设置因子水平的顺序
DF2$YEAR <- factor(DF2$YEAR, levels = c("2001", "2002", ...))

DF2$YEAR <- factor(DF2$YEAR, levels = sort(as.integer(as.character(DF2$YEAR))))

如果YEAR是一个因素,则需要这样一个复杂的调用as.integer(as.character(DF2$YEAR))。如果YEAR是一个整数,你可以直接对YEAR进行排序。