处理嵌套数据2

时间:2019-03-04 15:00:36

标签: r function data-manipulation

我是r的新手,在处理数据以进行分析时遇到了一些麻烦。如果有人可以提供帮助,我将不胜感激,因为这对我的研究至关重要。

我已经问过类似的问题,但是我得到的答案并未完全解决我的问题,这次我将尝试变得更加清晰,看看是否有人可以提供帮助。

我的数据看起来像这样:

df<- data.frame(
"Reporter" = c("USA", "USA", "USA", "USA", "USA","USA"),
"Partner" = c( "EU", "EU","EU","EU", "EU","EU"), 
"Product.cat" = c("1", "11", "111", "112", "12", "2"), 
"Product Description" = c("Food", "Fruit", "Apple", 
"Banana", "Meat", "Manifactured"),
"Year" = c(1970, 1970, 1970, 1970, 1970, 1970), 
"trade value" = c( 100, 50, 30, 20, 50, 220), 
stringsAsFactors = FALSE)

我有关于贸易的国别年观察。 向量'product.cat'指示要出口的商品类型。 product.cat 的位数越多,贸易信息的分类就越多。 例如, product.cat。 111(例如苹果)和112(例如香蕉)是产品类别11(例如水果)的子产品类别。 更高级别的聚合也是如此。产品类别11(水果)是 product.cat 1(食品)和 product.cat 12(肉)的子类别。 注意,较低类别的数据嵌套在较高级别的聚合中。因此, product.cat 11(50)的值等于 product.cat 111(30)+ product.cat 112的值(20)。

要进行分析,我需要确定那些未分类的数据值-即我需要确定未报告的三位数数据。

我的问题是,对于某些国家/地区的年度观察,我在所有聚合级别(例如1,11,111,112)上均准确地报告了数据,而对于其他国家/地区,我仅在较高聚合级别(例如12和2)上有数据。例如,在我的示例中,我只有 product.cat 12(肉),而没有关于哪种肉 product.cat 121(猪肉), product.cat 122(小牛肉)。 同样,在该示例中,关于 product.cat 2(制造)的数据也未以较低级别报告。 我们不知道 product.cat 21(衣服)还是 product.cat 22(木制品)。

换句话说,我有以2位数(12)或第一个数字级别(2)报告的数据,可以以3位数的级别报告。 请注意,每个类别应按3级数字分类

  • 我想做的是找到一种方法来个性化所有数据 排他 聚集并 更改其product.cat名称,并在末尾添加“ m”。
  • 在操作后, product.cat 12应该变为* 12m ,以指示仅在第二位报告了数据。 同样,我想识别仅在第一位数报告的出口 。 product.cat 2应该变为 2mm ,以反映仅在第一位报告了数据。

可以肯定的是,只有我具有较高聚合级别的信息(即在示例12和2中)的数据才应包含“ m”。 例如,在该示例中,我不希望有1mm,因为我的数据聚合级别较低(11,12)。同样,我也不想有11m,因为我的数据聚合级别较低(111,112)。我想要的是12m和2mm,因为仅以更高的聚合级别(12和2)报告数据。

我知道这是一个非常具体的问题,但是如果有人可以提供帮助,我将不胜感激。

注意:在实际数据集中,由于测量误差,分类值的总和并不总是完美地累加到较高的聚合级别。 (例如111 + 112可以> 11)。因此,理想情况下,为了解决该问题,我正在寻找一个函数,该函数能够根据除以国家,合作伙伴,年份而不是交易价值总和的位数来指定何时添加m。

我真的非常感谢能为我提供帮助的所有人,这对我的研究将是向前迈出的一大步。

----更新

我一直在研究此功能,但它似乎并没有满足我的要求。也许有人可以找出问题所在

fillLevel <- function(x, width = 3, fill = "m"){
sp <- split(x, substr(x, 1, 1))
sp <- lapply(seq_along(sp), function(i){
n <- nchar(sp[[i]])
if(all(n < 3)){
  j <- which(n == max(n))
  sp[[i]][j] <- gsub(" ", "m", formatC(sp[[i]][j], width = -3))
}
sp[[i]]
})
unname(unlist(sp))
}

df <- df%>% mutate(prdcat2 = fillLevel(df$Product.cat.))

最佳

1 个答案:

答案 0 :(得分:0)

这应该有效。请注意,其中带有空格的列名称会稍有更改(“产品目录”更改为“产品目录”等)。

df <- df %>%
      mutate(Product.cat. = case_when(nchar(Product.cat.) == 1 ~ paste0(Product.cat.,'mm'),
                                nchar(Product.cat.) == 2 ~ paste0(Product.cat.,'m'),
                                TRUE ~ Product.cat.))