我是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级数字分类
可以肯定的是,只有我具有较高聚合级别的信息(即在示例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.))
如您所见,它只有2mm而不是 12m 。而且,当我在更复杂的代码上运行它时,它会使我的数据顺序混乱。我认为这与sp <- lapply(seq_along(sp)
有关,但是我不确定该如何处理。
最佳
答案 0 :(得分:1)
这里是一种方法:
library(data.table)
setDT(df)
# tag levels
df[, lvl := nchar(Product.cat)]
df[lvl < 3L, has_subcat := FALSE]
# use level-3 observations to flag level-2s as okay
df[
df[lvl == 3, .(Reporter, Partner, Year, Product.cat = substr(Product.cat, 1, 2))],
on=.(Reporter, Partner, Year, Product.cat),
has_subcat := TRUE
]
# use level-2 observations to flag level-1s as okay
df[
df[lvl == 2, .(Reporter, Partner, Year, Product.cat = substr(Product.cat, 1, 1))],
on=.(Reporter, Partner, Year, Product.cat),
has_subcat := TRUE
]
# create new cat, flagging observations with no subcategories
df[, newcat := Product.cat]
df[has_subcat == FALSE, newcat := paste0(Product.cat, strrep("m", 3-lvl))]
Reporter Partner Product.cat Product.Description Year trade.value lvl has_subcat newcat
1: USA EU 1 Food 1970 100 1 TRUE 1
2: USA EU 11 Fruit 1970 50 2 TRUE 11
3: USA EU 111 Apple 1970 30 3 NA 111
4: USA EU 112 Banana 1970 20 3 NA 112
5: USA EU 12 Meat 1970 50 2 FALSE 12m
6: USA EU 2 Manifactured 1970 220 1 FALSE 2mm
我假设应该在“ Reporter-Partner-Year”中分别进行此操作。