Как сделать индекс и разделение столбцов на основе формата ниже - PullRequest
0 голосов
/ 12 июня 2018

Как сделать индекс и разделить столбцы на основе приведенного ниже формата

фрейм данных: DF

 ID    v1         v2       v3     v4    v5            v6     v7        v8     v9    v10      v11       v12        v13     v14   v15
   1    adi     20180501   4      US   california    john   20180504   4      AP   Vizag     ram     20180503      5      MP   Bhopal
   2    surya   20180502   5      MP   Bhopal        vamsi  20180505   5      UP   Lucknow   vijay   20180503      5      MP   Bhopal
   3    ram     20180503   5      MP   Bhopal        sam    20180503   5      MP   Bhopal    ram     20180503      5      MP   Bhopal

нужный фрейм данных: DF1

ID       v1         v2       v3     v4    v5          
   1    adi     20180501     4      US   california
       john     20180504     4      AP   Vizag 
       ram      20180503     5      MP   Bhopal
   2   surya    20180502     5      MP   Bhopal
       vamsi    20180505     5      UP   Lucknow   
       vijay    20180503     5      MP   Bhopal
   3   ram      20180503     5      MP   Bhopal 
       sam      20180503     5      MP   Bhopal 
       ram      20180503     5      MP   Bhopal 

Любая идея, как получитьнужный формат DF2, пробовал разные для циклов, не повезло.

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Вы можете использовать reshape из базы r

reshape(dat,matrix(2:ncol(dat),5),dir="long")

    ID time    v1       v2 v3 v4         v5 id
1.1  1    1   adi 20180501  4 US california  1
2.1  2    1 surya 20180502  5 MP     Bhopal  2
3.1  3    1   ram 20180503  5 MP     Bhopal  3
1.2  1    2  john 20180504  4 AP      Vizag  1
2.2  2    2 vamsi 20180505  5 UP    Lucknow  2
3.2  3    2   sam 20180503  5 MP     Bhopal  3
1.3  1    3   ram 20180503  5 MP     Bhopal  1
2.3  2    3 vijay 20180503  5 MP     Bhopal  2
3.3  3    3   ram 20180503  5 MP     Bhopal  3

или вы можете использовать data.table

library(data.table)
melt(setDT(dat), "ID",data.frame(t(matrix(2:ncol(dat),5))))

   ID variable value1   value2 value3 value4     value5
1:  1        1    adi 20180501      4     US california
2:  2        1  surya 20180502      5     MP     Bhopal
3:  3        1    ram 20180503      5     MP     Bhopal
4:  1        2   john 20180504      4     AP      Vizag
5:  2        2  vamsi 20180505      5     UP    Lucknow
6:  3        2    sam 20180503      5     MP     Bhopal
7:  1        3    ram 20180503      5     MP     Bhopal
8:  2        3  vijay 20180503      5     MP     Bhopal
9:  3        3    ram 20180503      5     MP     Bhopal

, если вам нужно расположить строки, вы сделаете:

melt(setDT(dat),id.vars = "ID",data.frame(t(matrix(2:ncol(dat),5))))[order(ID)][,variable:=NULL][]
   ID value1   value2 value3 value4     value5
1:  1    adi 20180501      4     US california
2:  1   john 20180504      4     AP      Vizag
3:  1    ram 20180503      5     MP     Bhopal
4:  2  surya 20180502      5     MP     Bhopal
5:  2  vamsi 20180505      5     UP    Lucknow
6:  2  vijay 20180503      5     MP     Bhopal
7:  3    ram 20180503      5     MP     Bhopal
8:  3    sam 20180503      5     MP     Bhopal
9:  3    ram 20180503      5     MP     Bhopal
0 голосов
/ 12 июня 2018

Мы можем разработать функцию для обработки фрейма данных, использовать mapply для повторения процесса, а затем использовать do.call и rbind для генерации окончательного результата.

dat_list <- mapply(function(x, i, n = 5){
  x2 <- x[, c("ID", paste0("v", (1:n) + n * (i - 1)))]
  names(x2) <- c("ID", paste0("v", (1:n)))
  x2[["ID"]] <- i
  return(x2)
}, i = 1:3, MoreArgs = list(x = dat), SIMPLIFY = FALSE)

dat2 <- do.call(rbind, dat_list)

dat2
#   ID    v1       v2 v3 v4         v5
# 1  1   adi 20180501  4 US california
# 2  1 surya 20180502  5 MP     Bhopal
# 3  1   ram 20180503  5 MP     Bhopal
# 4  2  john 20180504  4 AP      Vizag
# 5  2 vamsi 20180505  5 UP    Lucknow
# 6  2   sam 20180503  5 MP     Bhopal
# 7  3   ram 20180503  5 MP     Bhopal
# 8  3 vijay 20180503  5 MP     Bhopal
# 9  3   ram 20180503  5 MP     Bhopal

ДАННЫЕ

dat <- read.table(text = "ID    v1         v2       v3     v4    v5            v6     v7        v8     v9    v10      v11       v12        v13     v14   v15
   1    adi     20180501   4      US   california    john   20180504   4      AP   Vizag     ram     20180503      5      MP   Bhopal
                  2    surya   20180502   5      MP   Bhopal        vamsi  20180505   5      UP   Lucknow   vijay   20180503      5      MP   Bhopal
                  3    ram     20180503   5      MP   Bhopal        sam    20180503   5      MP   Bhopal    ram     20180503      5      MP   Bhopal",
                  header = TRUE, stringsAsFactors = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...