2016-04-14 3 views
2

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

no value 
1 A_0.9 
1 B_0.8 
1 C_0.7 
1 D_0.7 
2 B_0.9 
2 D_0.8 
2 A_0.7 
2 C_0.7 

Я хочу создать новый кадр данных, как показано ниже

no value1 value2 value3 value4 
1 A_0.9 B_0.8 C_0.7 D_0.7 
2 B_0.9 D_0.8 A_0.7 C_0.7 

а именно: для каждое уникальное значение в столбце «нет» будет содержать несколько столбцов, созданных с использованием данных в столбце «значение»

+1

Было бы интересно лучше переформатировать ваши данные, чтобы люди могли легче видеть, что такое столбцы. Лично я не вижу двухкадровый dataframe в вашем представлении. Это может повысить шансы получить правильный ответ. – Eduardo

+0

Хорошо, я скопировал данные из excel, но когда я разместил вопрос, он принял текстовый формат. Я скопировать и вставить Col один за другим, дайте мне знать, если это помогает понять требования данных объявлений, у меня есть 2 колонки в кадре данных, пожалуйста, обратитесь к ниже Col 1: нет Col 2: значение A_0.9 B_0.8 C_0.7 D_0.7 B_0.9 D_0.8 A_0.7 C_0.7 Я хочу создать новый фрейм данных как ниже Кол. 1: нет Колонка 2: значение1 A_0.9 B_0.9 Колонка 3: значение2 B_0.8 D_0.8 Колонка 4: значение3 C_0.7 A_0.7 Колонка 5: value4 D_0.7 C_0 .7 – user3734568

ответ

1

Использование data.table, мы можем создать последовательность на уникальный value по no с rleid(), и, следовательно, использовать его для dcast() данных в широком формате.

library(data.table) 
dcast(setDT(df)[, nr := rleid(value),by = no], no ~ nr) 
# no  1  2  3  4 
#1 1 A_0.9 B_0.8 C_0.7 D_0.7 
#2 2 B_0.9 D_0.8 A_0.7 C_0.7 

Или с dev version (1.9.7) из data.table, то возможно следующее, благодаря @Arun!

dcast(setDT(df), no ~ rowid(no, prefix = 'value')) 
# no value1 value2 value3 value4 
#1: 1 A_0.9 B_0.8 C_0.7 D_0.7 
#2: 2 B_0.9 D_0.8 A_0.7 C_0.7 
+0

Спасибо mtoto за это. – user3734568

+0

, пожалуйста, имейте в виду, что это решение примерно на x400 быстрее, чем метод 'unstack'. – mtoto

+0

Я пробовал и заметил, что выше код будет очень полезен для неравного наблюдения для каждой группы, доступной в столбце «нет» в примере фрейма данных, который я поделил. Коды, которыми вы поделились, отлично работали для меньшего набора данных, но когда я пробовал эти коды на большом наборе данных, я получил сообщение «Использование« nr »в качестве столбца значения. Используйте« value.var »для переопределения Функция агрегации отсутствует, длина». Не уверен, что это такое, и я не получил требуемый фрейм. Ниже приведены коды, которые я использовал. check <- dcast (setDT (raw.data) [, nr: = rleid (Value), by = no], no ~ nr) – user3734568

2
t(unstack(df, value ~ no)) 
# [,1] [,2] [,3] [,4] 
#X1 "A_0.9" "B_0.8" "C_0.7" "D_0.7" 
#X2 "B_0.9" "D_0.8" "A_0.7" "C_0.7" 

Чтобы убрать a Бове выход в соответствии с данными,

library(dplyr) 
df1 <- as.data.frame(t(unstack(df, value ~ no))) 
names(df1)[-1] <- paste0('value', 2:ncol(df1)-1) 
rownames(df1) <- NULL 
df1 <- add_rownames(df1, 'no') #from dplyr package 
# no value1 value2 value3 value4 
# (chr) (fctr) (fctr) (fctr) (fctr) 
#1  1 A_0.9 B_0.8 C_0.7 D_0.7 
#2  2 B_0.9 D_0.8 A_0.7 C_0.7 
+0

Это работает отлично, у меня только один запрос может быть более 4 значений для каждого уникального номера в col «no», поэтому для именования столбца есть какой-либо другой способ: – user3734568

+0

@ user3734568, см. Отредактированный ответ. – Sotos

+0

Большое спасибо за ваш ответ. – user3734568

0

Я хотел бы использовать reshape библиотеку, которая оборачивает хороший набор функций для манипулирования данными. Пример для выполнения вашей задачи:

n = c(1,1,1,1,2,2,2,2) 
x = c('A', 'B', 'C', 'D', 'A', 'B', 'C', 'D') 
# Just to create the column names you showed in the example 
columns = rep(paste("value", 1:4, sep=""), 2) 
data = data.frame(n, columns, x) 
cast(data, n~columns) 
+1

Способ определения столбцов здесь подходит только для примера набора данных и, следовательно, не масштабируется. – mtoto

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