2015-10-20 8 views
0

У меня есть набор данных в R, который состоит из одного столбца, содержащего переменные, которые я идеально хотел бы использовать в нескольких столбцах. Структура единичного блока данных данных является таковой.Разделить один столбец на несколько столбцов на основе строк

A1 
200 
250 
Brand x 
A2 
400 
300 
Brand x 
A4 
100 
320 
Brand x2 

Я хотел бы разделить эту колонку таким образом, чтобы он заканчивался в кадре нескольких столбцов, как это («|» чисто для обозначения столбца разделитель):

A1 | 200 | 250 | Brand x 
A2 | 400 | 300 | Brand x1 
A4 | 100 | 320 | Brand x2 

Как я могу это сделать? В горизонтальных данных в большинстве случаев есть последовательность: например, 4 переменные - A1,200, 250, Бренд x. Наивный эквивалент будет копировать и переносить вставку в Excel, но для предопределенной последовательности из 4 значений. Может ли кто-нибудь помочь мне в этом?

+0

Всегда ли 4 значения? – Heroka

ответ

2

Это не элитное решение, но должно работать.

Некоторые пояснения:

Первые две строки должны обеспечить только dataframe, которые вы обычно получить путем чтения данных.

Если символьная строка в столбце R преобразует этот столбец в факторную переменную. По этой причине я преобразовал его в строку 3 обратно в вектор символов.

С матрицей вы можете изменить этот вектор в нужной форме, а затем преобразовать его обратно в кадр данных (установка stringAsFactors=FALSE, чтобы предотвратить превращение всего в факторы, которые были бы по умолчанию).

Однако теперь все переменные являются символьными переменными. По этой причине вам необходимо соответствующим образом закодировать переменные.

dat<-c("A1",200,250,"Brand x" ,"A2",400,0300, "Brand x", "A4",100, 320,"Brand x2") 
dat<-data.frame(dat) 
dat<-as.character(dat[,1]) 
dat<-matrix(dat, ncol = 4, byrow=TRUE) 
dat<-data.frame(dat, stringsAsFactors = FALSE) 

dat[] <- lapply(dat, type.convert) 

> str(dat) 
'data.frame': 3 obs. of 4 variables: 
$ X1: Factor w/ 3 levels "A1","A2","A4": 1 2 3 
$ X2: int 200 400 100 
$ X3: int 250 300 320 
$ X4: Factor w/ 2 levels "Brand x","Brand x2": 1 1 2 

> dat 
    X1 X2 X3  X4 
1 A1 200 250 Brand x 
2 A2 400 300 Brand x 
3 A4 100 320 Brand x2 
+1

Используйте 'dat [] <- lapply (dat, type.convert)' вместо того, чтобы вручную делать 'as.numeric' и т. Д. И вы все еще не выяснили, как определить количество столбцов. –

+0

Спасибо за подсказку! И я узнал новую функцию. – Alex

+1

Вы не скопировали его правильно. Вам нужно добавить '[]' в конце 'dat', иначе вы создадите список вместо' data.frame' –

0

Если это всегда 4 значения цикл ниже сделал работу для меня:

df <- read.csv("df.csv", sep = ";", header = FALSE) 


new.df <- data.frame() 
j <- 1 
i <- 1 
while(i < length(df[,1])-1){ 

    temp.df <- data.frame() 

    temp.df[j,1] <- df[i,1] 
    temp.df[j,2] <- df[i + 1, 1] 
    temp.df[j,3] <- df[i + 2, 1] 
    temp.df[j,3] <- df[i + 3, 1] 

    new.df <- rbind(new.df, temp.df) 

    j <- j + 1 
    i <- i + 4 
} 
na.omit(new.df) 

это не полностью оптимизирован, но это делает работу! Надеюсь, это сработает для вас.

1

Просто намек здесь - если последовательность всегда повторяется (т.е. детерминирована), вы можете прочитать вектор и изменить размеры, что-то вроде:

data <- c("A1","200","250","Brand x","A2","400","300","Brand x","A4","100","320","Brand x2") 
dim(data) <- c(4,3) 
data <- t(data) # transpose 
class(data) 
data.df <- as.data.frame(data) 
class (data.df) 

это изменение DIMS данных в матрицу (поскольку внутренний вектор и матрица сохраняются одинаково, это разные размеры).

При выполнении он напечатает

> class(data) 
[1] "matrix" 
> class (data.df) 
[1] "data.frame" 

и data.df тогда объект data.frame, так что вы можете делать все, что нужно делать с данными (например, столбец изменений быть числовой/символ/и т. д.) перед обработкой данных.

3

Вот как я бы это сделать:

df2 <- as.data.frame(matrix(df1[,1], byrow=TRUE, ncol = 4)) 

или, что то же самое:

df2 <- as.data.frame(t(matrix(df1[,1],nrow = 4))) 

В обоих случаях это дает желаемый результат: данные

#> df2 
# V1 V2 V3  V4 
#1 A1 200 250 Brand x 
#2 A2 400 300 Brand x 
#3 A4 100 320 Brand x2 

df1 <-read.table(text="A1 
         200 
         250 
         'Brand x' 
         A2 
         400 
         300 
         'Brand x' 
         A4 
         100 
         320 
         'Brand x2'", header=FALSE) 
+0

Это то же самое, что и Алексей, нет? –

+0

Возможно, я не проверял. Он менялся так много раз, что я потерял трек. Однако этот взгляд выглядит короче. – RHertel

+0

@DavidArenburg Я не вижу никаких 'as.character',' stringAsFactors', 'type.convert' или' lapply' здесь. Поэтому я бы сказал, что все по-другому. За исключением результата. – RHertel

Смежные вопросы