Как переставить данные в кадре данных с помощью R (объединить похожие повторяющиеся столбцы) - PullRequest
1 голос
/ 05 октября 2010

У меня есть файл, в котором структура данных, содержащая 6 столбцов, хранится рядом. Это означает, что в плоском файле хранится n раз по 6 столбцов.
По сути, я хочу переставить данные в форме, в которой у меня есть только data.frame, содержащий 6 столбцов, но добавляющий все данные из файла в конец первых 6 столбцов.

Row 1V1 1V2 1V3 1V4 1V5 1V6 2V1 2V2 2V3 2V4 2V5 2V6 3V1...  
1  
2

Результат должен выглядеть так, как если бы данные перемещались из 2V1-2V6 в конец 1V1-1V6

Row V1 V2 V3 V4 V5 V6   
1-1  
1-2  
2-1  
2-2

Я посмотрел некоторые фрагменты кода и мог загрузить данные во фрейм данных со всеми векторами. Затем я попытался создать n фреймов данных, содержащих всегда повторяющиеся структуры данных. Затем я попытался объединить отдельные кадры данных в конечный, но он не работает.

df<-read.table("test.txt",header = FALSE, sep = ";", skip = 2)
columnmax=as.integer(ncol(df)/6)
dfnew <- vector(mode="list",length=columnmax)
for ( i in 1:columnmax) {
 start<-((i-1)*6+1)
 end<-(i*6)
 dfnew[[i]]<-df[,start:end]
}
y <- do.call(rbind, dfnew)

РЕЗУЛЬТАТ:

Error in match.names(clabs, names(xi)) : 
  names do not match previous names

Я использовал режим списка, потому что иначе он не работал, чтобы отделить фрейм данных. Но теперь мне кажется, что это приводит к проблеме, потому что «имена столбцов» не идентичны. Я даже не представляю, как изменить имена столбцов, потому что это не матрица в R-конце, а список. Я уверен, что должен быть намного более простой способ сделать то, что я хочу, но я только начинаю с R и не знаком со многими различными понятиями типов данных.

РЕДАКТИРОВАТЬ: ДАННЫЕ

structure(list(V1 = NA, V2 = NA, V3 = NA, V4 = NA, V5 = NA, V6 = NA, 
    V7 = NA, V8 = NA, V9 = NA, V10 = NA, V11 = NA, V12 = NA, 
    V13 = structure(1L, .Label = "1,20101E+27", class = "factor"), 
    V14 = structure(1L, .Label = "05.07.2010 14:50", class = "factor"), 
    V15 = structure(1L, .Label = "ADMINISTRATOR", class = "factor"), 
    V16 = 1L, V17 = NA, V18 = NA, V19 = structure(1L, .Label = "1,20101E+27", class = "factor"), 
    V20 = structure(1L, .Label = "05.07.2010 14:50", class = "factor"), 
    V21 = structure(1L, .Label = "ADMINISTRATOR", class = "factor"), 
    V22 = 1L, V23 = NA, V24 = NA, V25 = structure(1L, .Label = "1,20101E+27", class = "factor"), 
    V26 = structure(1L, .Label = "05.07.2010 14:50", class = "factor"), 
    V27 = structure(1L, .Label = "ADMINISTRATOR", class = "factor"), 
    V28 = 1L, V29 = NA, V30 = NA, V31 = structure(1L, .Label = "1,20101E+27", class = "factor"), 
    V32 = structure(1L, .Label = "05.07.2010 14:50", class = "factor"), 
    V33 = structure(1L, .Label = "ADMINISTRATOR", class = "factor"), 
    V34 = 1L, V35 = NA, V36 = NA, V37 = NA, V38 = NA, V39 = NA, 
    V40 = NA, V41 = NA, V42 = NA, V43 = NA, V44 = NA, V45 = NA, 
    V46 = NA, V47 = NA, V48 = NA, V49 = NA, V50 = NA, V51 = NA, 
    V52 = NA, V53 = NA, V54 = NA, V55 = NA, V56 = NA), .Names = c("V1", 
"V2", "V3", "V4", "V5", "V6", "V7", "V8", "V9", "V10", "V11", 
"V12", "V13", "V14", "V15", "V16", "V17", "V18", "V19", "V20", 
"V21", "V22", "V23", "V24", "V25", "V26", "V27", "V28", "V29", 
"V30", "V31", "V32", "V33", "V34", "V35", "V36", "V37", "V38", 
"V39", "V40", "V41", "V42", "V43", "V44", "V45", "V46", "V47", 
"V48", "V49", "V50", "V51", "V52", "V53", "V54", "V55", "V56"
), row.names = 1L, class = "data.frame")

Ответы [ 2 ]

4 голосов
/ 05 октября 2010

Попробуйте:

x1 <- seq(from=1, to=ncol(df)-1, by=6)
x2 <- seq(from=6, to=ncol(df), by=6)

dfnew <- data.frame("V1"=0,"V2"=0,"V3"=0,"V4"=0,"V5"=0,"V6"=0)

for(x in 1:(ncol(df)/6)) {
tmpdf <- df[x1[x]:x2[x]]
colnames(tmpdf) <- colnames(dfnew)
dfnew <- rbind(dfnew,tmpdf)
}
2 голосов
/ 05 октября 2010

Вот простой цикл, который сделает всю работу за вас:

Сначала фиктивные данные

> set.seed(123)
> DF <- data.frame(matrix(rnorm(5*6*6), ncol = 36))
> names(DF) <- paste(rep(1:6, each = 6), "V", rep(1:6, times = 6), sep = "")
> names(DF)
 [1] "1V1" "1V2" "1V3" "1V4" "1V5" "1V6" "2V1" "2V2" "2V3" "2V4" "2V5" "2V6"
[13] "3V1" "3V2" "3V3" "3V4" "3V5" "3V6" "4V1" "4V2" "4V3" "4V4" "4V5" "4V6"
[25] "5V1" "5V2" "5V3" "5V4" "5V5" "5V6" "6V1" "6V2" "6V3" "6V4" "6V5" "6V6"

Теперь настройте цикл так, чтобы на каждом этапе мы брали i, i +6, i + (2 * 6), ... столбцов фрейма данных и укладываем их в вектор в новый фрейм данных DF2

> n <- 6 ## number of groups of 6
> DF2 <- data.frame(matrix(NA, ncol = 6, nrow = 6 * nrow(DF)))
> for(i in seq_len(n)) {
+     DF2[[i]] <- unlist(DF[, seq(i, n*6, by = 6)])
+ }
> names(DF2) <- paste("V", seq_len(n), sep = "")
> head(DF2)
           V1         V2         V3         V4         V5         V6
1 -0.56047565  1.7150650  1.2240818  1.7869131 -1.0678237 -1.6866933
2 -0.23017749  0.4609162  0.3598138  0.4978505 -0.2179749  0.8377870
3  1.55870831 -1.2650612  0.4007715 -1.9666172 -1.0260044  0.1533731
4  0.07050839 -0.6868529  0.1106827  0.7013559 -0.7288912 -1.1381369
5  0.12928774 -0.4456620 -0.5558411 -0.4727914 -0.6250393  1.2538149
6  0.42646422  0.6886403 -0.6947070 -1.1231086  0.2533185  1.5164706

Это предполагает, что существует всего 6 переменных,но n контролирует количество наборов из 6, которые у вас есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...