Написание вложенного цикла for для объединения строк, которые совместно используют ключ в кадре данных в R - PullRequest
0 голосов
/ 19 сентября 2018

Итак, у меня есть ключевой фрейм данных с идентификаторами

IDs <- data.frame(c(123,456,789))

У меня также есть фрейм данных разделенных SQL-запросов, которые необходимо объединить (возникла проблема с усечением запросов из-за их длины, поэтомуМне пришлось разделить их на части)

splitQueriesdf <- data.frame(ID = c(123,123,123,456,456,456,789,789,789), SplitQUery = c("SELECT", "* FROM", "tablename1","SELECT", "* FROM", "tablename2","SELECT", "* FROM", "tablename3"))

Мне нужно написать цикл, который объединяет запросы по идентификаторам, присутствующим в кадре данных идентификаторов, в третий кадр данных.Nrows (идентификаторы) будут различаться, поэтому мне нужно, чтобы они тоже были динамическими

Так что мне нужен третий кадр данных, чтобы он выглядел следующим образом:

    ID  FullQuery
 1  123 SELECT * FROM tablename1
 2  456 SELECT * FROM tablename2
 3  789 SELECT * FROM tablename3

У меня есть идея, что мне нуженцикл, который проходит по длине идентификаторов - так 3 раза, и вложенный цикл, который добавляет правильные строки вместе, но я довольно плохо знаком с R, и я застреваю.Вот что у меня есть:

dataframe3= NULL
for (index in 1:nrow(IDs)){
   for (index2 in 1:nrow(splitQueriesdf)){ 
     dataframe3[index] <- rbind(splitQueriesdf[index2,4])
  }
}

Любая помощь очень ценится!

Ответы [ 3 ]

0 голосов
/ 19 сентября 2018

Используя пакет данных таблицы вы можете сделать:

library(data.table)
IDs <- data.frame(ID = c(123,456,789))
splitQueriesdf <- data.frame(ID = c(123,123,123,456,456,456,789,789,789), SplitQUery = c("SELECT", "* FROM", "tablename1","SELECT", "* FROM", "tablename2","SELECT", "* FROM", "tablename3"))

setDT(splitQueriesdf)
splitQueriesdf[ID %in% IDs$ID, paste(SplitQUery, collapse = " "), by = .(ID)]

   ID                FullQuery
1: 123 SELECT * FROM tablename1
2: 456 SELECT * FROM tablename2
3: 789 SELECT * FROM tablename3
0 голосов
/ 19 сентября 2018

с тидиверсом:

splitQueriesdf %>% group_by(ID) %>% summarise(query=paste(SplitQUery,collapse=" "))
## A tibble: 3 x 2
#     ID query                   
#  <dbl> <chr>                   
#1   123 SELECT * FROM tablename1
#2   456 SELECT * FROM tablename2
#3   789 SELECT * FROM tablename3
0 голосов
/ 19 сентября 2018

Один вариант: aggregate из base R для группировки по 'ID', а затем paste столбец 'SplitQUery'

splitQueriesdf$SplitQUery <- as.character(splitQueriesdf$SplitQUery)
aggregate(cbind(FullQuery = SplitQUery) ~ ID, splitQueriesdf,
          FUN = paste, collapse = ' ')
#  ID                FullQuery
#1 123 SELECT * FROM tablename1
#2 456 SELECT * FROM tablename2
#3 789 SELECT * FROM tablename3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...