Преобразование таблицы R - PullRequest
0 голосов
/ 16 декабря 2011

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

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

Буду признателен, если кто-нибудь сможетдай мне решение.

Ответы [ 3 ]

2 голосов
/ 16 декабря 2011

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

# 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 голос
/ 16 декабря 2011

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

В R таблица - это особый случай матрицы, которая возникает в результате кросс-табуляции.Я думаю, что вы должны (или хотите) начать с data.frame.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, но это должно помочь вам начать.

0 голосов
/ 16 декабря 2011

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

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

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