我需要对数据进行“拆分”以保留之前的订单,为此我使用了提供的 data.table 解决方案 here 。我将数据“拆分”为两列。请参阅下面的示例:
df = data.frame(product = c("b", "a", "b", "a"),
value = c(sample(1:10,4)),
year = c(2001, 2001, 2000, 2000))
require(data.table)
dt <- data.table(df)
dt[, grp := .GRP, by = list(product,year)]
setkey(dt, grp)
o2 <- dt[, list(list(.SD)), by = grp]$V1
此代码返回列表,而不按字母或数字重新排序。但是,我想将项目名称更改为产品和年份的组合。
> o2
[[1]]
product value year
1: b 3 2001
[[2]]
product value year
1: a 8 2001
[[3]]
product value year
1: b 4 2000
[[4]]
product value year
1: a 7 2000
预期结果应如下所示:
> o2
$b.2001
product value year
1: b 3 2001
$a.2001
product value year
1: a 8 2001
$b.2000
product value year
1: b 4 2000
$a.2000
product value year
1: a 7 2000
另一种分割技术也可以,但我需要保留之前的顺序。感谢您的想法
最佳答案
这是我目前的处理方法。
require(data.table)
tmp = setDT(df)[, list(grp=list(.SD)), by=.(product, year), .SDcols=names(df)]
setattr(ans <- tmp$grp, 'names', paste(tmp$product, tmp$year, sep="."))
ans
# $b.2001
# product value year
# 1: b 7 2001
#
# $a.2001
# product value year
# 1: a 3 2001
#
# $b.2000
# product value year
# 1: b 10 2000
#
# $a.2000
# product value year
# 1: a 9 2000
我添加了 FR #1389提供一种 split.data.table 方法,通过该方法可以一步完成此操作。
但在大多数情况下,处理一个data.frame/data.table比处理一个列表更容易。因此,更深入地了解您的下游任务可能有助于确定这是否真的有必要。
关于R:如何更改 data.table 列表的项目(或对象)名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33068791/