【发布时间】:2019-03-04 15:00:36
【问题描述】:
我是 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)。
为了进行我的分析,我需要确定那些未在最分解的可能级别上报告的值 - 即 我需要确定未在 3 位级别报告的数据。
我的问题是,对于某些国家/地区年度观察,我有准确报告所有汇总级别的数据(例如 1,11,111,112),而对于其他人,我只有更高级别汇总的数据(例如 12 和 2)。例如,在我的示例中,我只有 product.cat 12(肉),但没有关于什么样的肉 product.cat 121(猪肉)的数据,product.cat 122(小牛肉)。 同样,在示例中,product.cat 2(制造)的数据未在较低级别报告。 我们不知道是 product.cat 21(服装)还是 product.cat 22(木制品)。
换句话说,我有可以在 3 位级别报告的 2 位 (12) 或第一位 (2) 级别的数据。 请注意,每个类别都应按 3 级数字进行分类
- 我想做的是找到一种方法来对所有数据进行个体化 独家 在更高级别的聚合和报告中 /em> 更改他们的 product.cat 名称,在末尾添加一个“m”。
- 操作后 product.cat 12 应该变成* 12m 表示数据仅在第 2 位报告。 同样,我想识别在第一位报告的出口 仅 。 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.))
最好的
【问题讨论】:
-
如果您将类别转换为数字,因此 12 而不是“12”(字符 12),那么您可以使用 floor 函数。 floor(x/100) > 0 仅当产品具有三位数时。对它们进行分类,然后 floor(x/10) > 0 & floor(x/100) = 0 两位数。您可以尝试这个想法并获得更好的方法,但我认为这是一个有用的提示。
-
提供的数据中存在错误,其中 Banana 被列为 122,即使它应该是 112,而 Veal 是 Product.cat。 122.跨度>
-
是的,@camnesia,你说得对,我已经更正了
-
@aginensky,是的,这可能是一个想法,问题是该类别的实际数据从 0、00、001 开始。您能否准确指定我如何在这个案子?
-
嗯。为什么不使用 strsplit 和 length ?如 "length(strsplit("00","")[[1]]) " (返回 2)
标签: r function data-manipulation