gpt4 book ai didi

r - 为大型数据库中的每个标识符添加由 0 组成的行

转载 作者:行者123 更新时间:2023-12-05 00:22:15 25 4
gpt4 key购买 nike

我有一个数据库,其中每个唯一标识符的第一行都丢失了。
基本上,我需要为每个唯一 id 添加一个由 0 组成的新行。

我的数据库看起来像这样(我有超过一百万行,所以循环基本上是不可能的)。

dt = as.data.frame( rbind(c('A1', '15', '1'), 
c('A1', '17', '2'),
c('A1', '12', '3'),
c('B1', '3', '1'),
c('B1', '4', '2'),
c('B1', '15', '3')))

colnames(dt) = c('id', 'activity', 'time')

对于每个 id,我需要在时间 0 添加 0 行。

以下代码行有效,但是,我的数据库需要太多时间。
IdUnique = length(unique(dt$id))
VeK = vector('list', IdUnique)
for(i in 1:IdUnique){
row0 = matrix(0, nrow = 1, ncol = ncol(dt), dimnames = list(unique(dt$id)[i], colnames(dt)))
VeK[[i]] = rbind(row0, subset(dt, id == unique(dt$id)[i]) )
VeK[[i]][,'id'] <- unique(dt$id)[i]
}

dt2 <- do.call("rbind", VeK)

我想知道是否有更经济的解决方案,例如按行合并
并通过 id。但我不知道该怎么做。
mat = matrix(0, nrow = length(unique(dt$id)), ncol = ncol (dt) ) 
colnames(mat) <- colnames(dt)

mat[, 'id'] <- as.character(unique(dt$id))
mat <- as.data.frame(mat)

merge(mat, dt, by = 'id' )

按行合并并控制标识符的任何解决方案?

最佳答案

尝试:

library(dplyr)
dt %>%
group_by(id) %>%
summarise(activity = 0, time = 0) %>%
merge(., dt, all = T) %>%
arrange(id, time)

或者:
dt %>% 
group_by(id) %>%
summarise_each(funs(as.character(0))) %>%
full_join(., dt) %>%
arrange(id, time)

这使:
#  id activity time
#1 A1 0 0
#2 A1 15 1
#3 A1 17 2
#4 A1 12 3
#5 B1 0 0
#6 B1 3 1
#7 B1 4 2
#8 B1 15 3

之后,如果要转换 activitytime您可以添加的数字列:
... %>% mutate_each(funs(type.convert(as.character(.))), -id)

更新

如果在您的原始 dt 中不是故意制造等级差异的,这样会容易一些:
dt <- data.frame(id = c(rep("A1", 3), rep("B1", 3)),
activity = c(15,17,12,3,4,15),
time = rep(1:3, 2))

library(dplyr)
dt %>%
group_by(id) %>%
summarise(activity = 0, time = 0) %>%
full_join(., dt) %>%
arrange(id, time)

关于r - 为大型数据库中的每个标识符添加由 0 组成的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30276270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com