2011-12-15 47 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包,但这应该让你开始。