2014-02-12 4 views
2

Я столкнулся с проблемой перестройки с помощью dataframe. Он содержит еще много строк и столбцов. Упрощенно его структура выглядит следующим образом:reshape dataframe R

rownames year x1 x2 x3 
a   2000 2 6 11 
b   2000 0 4 2 
c   2000 0 3 5 
a   2010 2 6 11 
b   2010 0 0 0 
c   2020 4 1 8 
a   2020 10 1 7 
b   2020 8 4 10 
c   2020 22 1 16 

Я хотел бы выйти с dataframe, который имеет одну единственную строку для переменного «года», скопируйте x1, x2, значение x3 в последующих столбцах, переименовывать столбцы с комбинацией между именем rowname и переменной x. Он должен выглядеть следующим образом:

year a_x1 a_x2 a_x3 b_x1 b_x2 b_x3 c_x1 c_x2 c_x3 
2000 2  6  11 0  4  2  0  3  5 
2010 2  6  11 0  0  0  4  1  8 
2020 10 1  7  8  4  10 22 1  16 

Я думал использовать последующую функции cbind(), но так как я должен сделать это для тысяч строк и сотни столбцов, я надеюсь, что есть более прямой путь с пакетом RESHAPE (с которыми я еще не знаком)

Заранее спасибо!

+0

пожалуйста, используйте 'dput (sample_data)', так что пользователи могут применять свои предложения к тому же данные, которые вы смотрите. –

+0

Как вы хотите иметь дело с дублируемыми значениями? Или я должен предположить, что это была ошибка, основанная на вашем примере вывода? – A5C1D2H2I1M1N2O1R2T1

+0

@HansRoggeman в этом случае воспроизводится на 100%: 'dt <- read.table (text =" ... ",, header = TRUE)' и просто заменяет '...' скопированным текстом. – Beasterfield

ответ

4

Во-первых, я надеюсь, что rownames - это столбец data.frame, а не имя родословной data.frame. В противном случае вы столкнетесь с проблемами из-за неединственности значений.

Я думаю, что ваша главная проблема в том, что ваш data.frame не полностью расплавленный:

library(reshape2) 

dt <- melt(dt, id.vars=c("year", "rownames")) 
head(dt) 
    year rownames variable value 
1 2000  a  x1  2 
2 2000  b  x1  0 
3 2000  c  x1  0 
4 2010  a  x1  2 
... 

dcast(dt, year ~ rownames + variable) 
    year a_x1 a_x2 a_x3 b_x1 b_x2 b_x3 c_x1 c_x2 c_x3 
1 2000 2 6 11 0 4 2 0 3 5 
2 2010 2 6 11 0 0 0 4 1 8 
3 2020 10 1 7 8 4 10 22 1 16 

EDIT:

Как @spdickson указует, есть также ошибка в ваших данных избегая простой агрегации. Комбинации year, rowname должны быть уникальными, конечно. В противном случае вам понадобится функция агрегации, которая определяет результирующие значения неповторимых комбинаций. Поэтому мы предполагаем, что строка 6 в ваших данных должна читать c 2010 4 1 8.

+0

Ударьте меня на 15 секунд ... +1 – A5C1D2H2I1M1N2O1R2T1

+0

Ошибка в его наборе данных примера сделала так, чтобы 'dcast()' агрегировал ваши результаты с использованием длины. Если вы измените первый экземпляр '2020' на' 2010', это должно исправить его, чтобы вы получили желаемые результаты. –

+0

@spdickson Я не понял, но очень хороший момент! – Beasterfield

3

Вы можете попробовать использовать reshape() из базы R без необходимости дальнейшего плавить dataframe:

df1 <- read.table(text="rownames year x1 x2 x3 
a   2000 2 6 11 
b   2000 0 4 2 
c   2000 0 3 5 
a   2010 2 6 11 
b   2010 0 0 0 
c   2010 4 1 8 
a   2020 10 1 7 
b   2020 8 4 10 
c   2020 22 1 16",header=T,as.is=T) 

reshape(df1,direction="wide",idvar="year",timevar="rownames") 
# year x1.a x2.a x3.a x1.b x2.b x3.b x1.c x2.c x3.c 
# 1 2000 2 6 11 0 4 2 0 3 5 
# 4 2010 2 6 11 0 0 0 4 1 8 
# 7 2020 10 1 7 8 4 10 22 1 16