您好我正在使用具有以下特征的表:
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 :(得分: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.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
包可以进行更复杂的转换,但这应该可以帮助您入门。
答案 2 :(得分:0)
可能我理解这个错误但是?reshape
你在寻找什么?
来自例子:
summary(Indometh)
wide <- reshape(Indometh, v.names="conc", idvar="Subject", timevar="time", direction="wide")
wide