我被一项任务卡住了很长一段时间。我有一个数据帧,它由不同的关键字和单元组成,每个关键字和单元跨越数周。我需要将这个数据帧分成较小的数据帧块,每个帧由具有相同关键字的值组成,以便这个较大的数据帧成为一个数据帧列表。
例如,假设较大的数据帧为
KEY UNITS WEEK YEAR
A-1 42 2 2019
A-1 24 3 2019
A-1 29 5 2019
A-1 36 6 2019
A-2 27 2 2019
A-2 46 3 2019
A-2 44 4 2019
B-1 53 2 2019
B-1 31 4 2019
B-1 25 5 2019
B-1 52 6 2019
B-1 30 8 2019
B-2 46 2 2019
B-2 38 3 2019
B-2 36 4 2019我想将这个数据帧分解成一个数据帧列表,其中关键字在每个单独的数据帧中保持唯一,如下所示:
KEY UNITS WEEK YEAR KEY UNITS WEEK YEAR KEY UNITS WEEK YEAR
A-1 30 2 2019 A-2 43 2 2019 B-1 24 2 2019
A-1 43 3 2019 A-2 54 3 2019 B-1 47 4 2019
A-1 25 5 2019 A-2 54 4 2019 B-1 53 5 2019
A-1 29 6 2019 B-1 25 6 2019和
KEY UNITS WEEK YEAR
B-1 41 8 2019
B-2 54 2 2019
B-2 44 3 2019
B-2 33 4 2019并获得所有这些数据帧作为数据帧列表。
现在我试着使用下面的代码片段来做,但是它有性能问题,因为我的唯一键的数量非常大:
ds1<-list()
for (j in 1:num_of_unique_keys)
{
ds1[[j]]<-subset(dataset, dataset$KEY==extkeys[j])
}
head(ds1[[2]])这里'num_of_unique_keys‘是在较大的数据帧中有多少唯一关键字的总计数,' dataset’是我正在处理的数据集,‘extkey’是数据集中唯一关键字的列表,'ds1‘是我想要作为输出获得的数据帧列表。我知道性能问题主要是因为for循环,这在R中是不可行的,但我就是找不到另一个有效的方法来解决这个问题。
如果能帮上忙我会很感激的。
发布于 2020-05-12 22:32:38
在Base-R中
split(dataset, dataset$KEY)输出:
$`A-1`
KEY UNITS WEEK YEAR
1 A-1 42 2 2019
2 A-1 24 3 2019
3 A-1 29 5 2019
4 A-1 36 6 2019
$`A-2`
KEY UNITS WEEK YEAR
5 A-2 27 2 2019
6 A-2 46 3 2019
7 A-2 44 4 2019
$`B-1`
KEY UNITS WEEK YEAR
8 B-1 53 2 2019
9 B-1 31 4 2019
10 B-1 25 5 2019
11 B-1 52 6 2019
12 B-1 30 8 2019
$`B-2`
KEY UNITS WEEK YEAR
13 B-2 46 2 2019
14 B-2 38 3 2019
15 B-2 36 4 2019发布于 2020-05-12 22:34:49
你可以做到
lapply(unique(dataset[, "KEY"]), function(x) {
tempDf <- dataset[dataset[, "KEY"] %in% x, ]
return(tempDf)
}))注意,如果您想要根据WEEK或其他东西通过
columns = c("KEY", "WEEK")
map(columns, function(a) lapply(unique(dataset[, a]), function(x) {
tempDf <- dataset[dataset[, a] %in% x, ]
return(tempDf)
}))发布于 2020-05-12 22:37:54
如果我理解正确的话,您希望每个密钥使用不同的数据帧
df <- tribble(~KEY, ~UNITS, ~WEEK, ~YEAR,
"A-1", 42, 2, 2019,
"A-1", 24, 3, 2019,
"A-1", 29, 5, 2019,
"A-1", 36, 6, 2019,
"A-2", 27, 2, 2019,
"A-2", 46, 3, 2019,
"A-2", 44, 4, 2019,
"B-1", 53, 2, 2019,
"B-1", 31, 4, 2019,
"B-1", 25, 5, 2019,
"B-1", 52, 6, 2019,
"B-1", 30, 8, 2019,
"B-2", 46, 2, 2019,
"B-2", 38, 3, 2019,
"B-2", 36, 4, 2019)
map(unique(df$KEY), ~{
df %>% filter(KEY == .x)
}) %>% set_names(nm = unique(df$KEY))https://stackoverflow.com/questions/61754363
复制相似问题