2011-12-15 2 views
0

Здравствуйте, я работаю с таблицей с этими характеристиками:R таблица преобразования

2000 0.051568 
2000 0.04805 
2002 0.029792 
2002 0.056141 
2008 0.047285 
2008 0.038989 

И мне нужно, чтобы преобразовать его в нечто вроде этого:

2000  2002  2008 

0.051568 0.029792 0.047285 
0.04805 0.056141 0.038989 

Я был бы признателен, если кто-то может дать я решение.

ответ

0

Возможно, я понимаю это неправильно, но ?reshape Что вы ищете? из примеров:

summary(Indometh) 
wide <- reshape(Indometh, v.names="conc", idvar="Subject", timevar="time", direction="wide") 

wide 
2

Вот относительно простое решение:

# CREATE ORIGINAL DATA.FRAME 
df <- read.table(text="2000 0.051568 
2000 0.04805 
2002 0.029792 
2002 0.056141 
2008 0.047285 
2008 0.038989", header=FALSE) 
names(df) <- c("year", "value") 

# MODIFY ITS LAYOUT 
df2 <- as.data.frame(split(df$value, df$year)) 
df2 
#  X2000 X2002 X2008 
# 1 0.051568 0.029792 0.047285 
# 2 0.048050 0.056141 0.038989 
1

Я предполагаю, что вы новичок в R, так что я собираюсь предположить, что вы имеете в виду и дать вам еще немного правильная терминология. Если я ошибаюсь, то, по крайней мере, это может помочь вам прояснить вопрос.

В R таблица представляет собой частный случай матрицы, которая возникает из перекрестной табуляции. Я думаю, что вы (или хотите) начать с data.frame. A data.frame - это набор столбцов с потенциально разными типами, но с одинаковой длиной; он «прямоугольный» в этом смысле. Как правило, элементы в тех же позициях в столбцах (то есть каждая строка) data.frame связаны друг с другом. Столбцы data.frame имеют имена, также как и строки.

long <- data.frame(year=c(2000,2000,2002,2002,2008,2008), 
        val=c(0.051568, 0.04805, 0.029792, 
         0.056141, 0.047285, 0.038989)) 

которая при печати выглядит как

> long 
    year  val 
1 2000 0.051568 
2 2000 0.048050 
3 2002 0.029792 
4 2002 0.056141 
5 2008 0.047285 
6 2008 0.038989 

сам по себе, это не достаточно, потому что для нужного выхода, то необходимо указать, какое значение, скажем, 2000 в первом ряду и который находится во втором (и т. д., если их было больше). В вашем примере, это просто порядок они находятся.

long$targetrow = 1:2 

Что делает long выглядеть как

> long 
    year  val targetrow 
1 2000 0.051568   1 
2 2000 0.048050   2 
3 2002 0.029792   1 
4 2002 0.056141   2 
5 2008 0.047285   1 
6 2008 0.038989   2 

Теперь вы можете использовать reshape на нем.

reshape(long, idvar="targetrow", timevar="year", direction="wide") 

который дает

> reshape(long, idvar="targetrow", timevar="year", direction="wide") 
    targetrow val.2000 val.2002 val.2008 
1   1 0.051568 0.029792 0.047285 
2   2 0.048050 0.056141 0.038989 

Более сложные преобразования возможны с помощью reshape2 пакет, но это должно вам начать работу.

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