R表转换

时间:2011-12-15 20:57:50

标签: 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

如果有人能帮我解决,我将不胜感激。

3 个答案:

答案 0 :(得分: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 :(得分:1)

我猜你是R的新手,所以我会猜测你的意思并给你一些更正确的术语。如果我猜错了,那么至少这可以帮助你澄清这个问题。

在R中,表格是由交叉制表产生的矩阵的特例。我认为你有(或想要)开始的是data.framedata.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包可以进行更复杂的转换,但这应该可以帮助您入门。

答案 2 :(得分:0)

可能我理解这个错误但是?reshape你在寻找什么? 来自例子:

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

wide