Я искал некоторую ясность в этом, но не могу найти что-то подходящее для моего случая, я построил DF, очень похожий на этот (но со значительно большим количеством данных, в общей сложности более миллиона строк)
Key1 <- c("A", "B", "C", "A", "C", "B", "B", "C", "A", "C")
Key2 <- c("A1", "B1", "C1", "A2", "C2", "B2", "B3", "C3", "A3", "C4")
NumVal <- c(2, 3, 1, 4, 6, 8, 2, 3, 1, 0)
DF1 <- as.data.frame(cbind(Key1, Key2, NumVal), stringsAsFactors = FALSE) %>% arrange(Key2)
ConsId <- c(1:10)
DF1 <- cbind(DF1, ConsId)
Теперь я хочу добавить, скажем, 3 новых столбца (в реальной жизни мне нужно 12, но для большей наглядности в этом игрушечном примере мы будем использовать 3) к даннымкадр, где каждая строка соответствует значениям $ NumVal с тем же $ Key1 и большим или равным $ ConsId для значений в каждой строке и заполнением оставшихся пробелов NA, вот ожидаемый результат, если я не оченьclear:
Key1 Key2 NumVal ConsId V1 V2 V3
A A1 2 1 2 4 1
A A2 4 2 4 1 NA
A A3 1 3 1 NA NA
B B1 3 4 3 8 2
B B2 8 5 8 2 NA
B B3 2 6 2 NA NA
C C1 1 7 1 6 3
C C2 6 8 6 3 0
C C3 3 9 3 0 NA
C C4 0 10 0 NA NA
Теперь я использую do.call (rbind), и даже если он работает нормально, это занимает слишком много времени для моих реальных данных с чуть более 1 миллиона строк (около 6hrs), я также пытался использовать функцию bind_rows dplyr, но это заняло немного больше времени, поэтому я остановился на опции do.call, вот пример кода, который я использую:
# Function
TranspNumVal <- function(i){
Id <- DF1[i, "Key1"]
IdCons <- DF1[i, "ConsId"]
myvect <- as.matrix(filter(DF1, Id == Key1, ConsId >= IdCons) %>% select(NumVal))
Result <- as.data.frame(t(myvect[1:3]))
return(Result)
}
# Applying the function to the entire data frame
DF2 <- do.call(rbind, lapply(1:NROW(DF1), function(i) TranspNumVal(i)))
DF3 <- cbind(DF1, DF2)
Возможно, изменениекласс вызываеткод настолько неэффективен, или, может быть, я просто не нахожу лучшего способа векторизовать мою проблему (вы не хотите знать, сколько времени это заняло с помощью вложенного цикла), я довольно плохо знаком с R и простоначал дурачиться с dplyr, так что я открыт для любых предложений о том, как оптимизировать мой код