奇数row.names列出现在reshape中

时间:2014-04-20 01:51:13

标签: r reshape

我认为我非常接近解决方案,我只需要在正确的方向上指点几点,我非常希望能够理顺这一点!

所以我有一个数据集,我只想变成两列。这是一个类似的虚拟数据集。

1   1.1  1.2  1.3  1.4
2   2.1  2.2  2.3  2.4
3   3.1  3.2  3.3  3.4
4   4.1  4.2  4.3  4.4

这是一个csv,所以当我导入它时,R会附加自己的标题,如下所示:

V1  V2   V3   V4   V5
1   1.1  1.2  1.3  1.4
2   2.1  2.2  2.3  2.4
3   3.1  3.2  3.3  3.4
4   4.1  4.2  4.3  4.4

我希望它看起来像这样:

id value
1  1.1
1  1.2
1  1.3
1  1.4
2  2.1
2  2.2
...
4  4.4

问题是,这是一个正在进行的项目,数据集(V6,V7等)将有更多列,因此我无法对任何内容进行硬编码。我保存了所有标题名称的列表,这似乎有效。

data <- read.csv(file="location", header = FALSE)
dates = ncol(data)
list = 2:dates
variables <-paste0('V',list)

所以现在变量是我要压缩成一列的所有列的列名列表。

我的重塑代码是:

newdata <- reshape(data, idvar = "V1", direction = "long", varying = variables, sep="")

但它给了我一个意想不到的数据框架。我明白了:

row.names   V1  time      V
      1.2    1     2    1.1
      2.2    2     2    2.1
      3.2    3     2    3.1
      4.2    4     2    4.1
      1.3    1     3    1.2
      ...

V1和V列是正确的 - 这就是我想要的,如果没有排序,它会正确匹配。但是,row.names和时间来自哪里?我可以删除时间但不能删除row.names,因为当我尝试使用newdata [,1]访问列row.names时,它给出了V1列,而newdata [“row.names”]表示“未选择未定义的列”。

因此,如果有人可以告诉我我做错了什么或如何重新格式化我的重塑声明所以这些奇怪的列没有出现我会非常感激。谢谢!

2 个答案:

答案 0 :(得分:2)

您描述的行为......

首先,您描述的行为来自使用Viewfix,如果row.names不仅仅是数据集中行数的序列,则电子表格视图,它显示为另一列名为&#34; row.names&#34;。

的数据

这是一个小例子:

## Sample data
df1 <- df2 <- data.frame(matrix(1:4, ncol = 2, 
                                dimnames = list(c("A", "B"), c("a", "b"))))
rownames(df2) <- NULL

fix(df1)  # R's spreadsheet view

enter image description here

View(df1) # RStudio data viewer

enter image description here

fix(df2)

enter image description here

View(df2)

enter image description here

reshape按预期工作

其次,基R中的reshape函数有一个new.row.names参数。很遗憾,您无法将其设置为NULL。如果要删除默认创建的奇怪row.names,则需要将其设置为顺序向量。要做到这一点,您需要知道最终数据的长度(不同列数乘以原始数据集中的行数)。因此,您可以执行以下操作:

id <- "V1"
varCols <- setdiff(names(mydf), "V1")
out <- reshape(mydf, direction = "long", idvar=id, varying=varCols, sep = "", 
               new.row.names=sequence(prod(length(varCols), nrow(mydf))))

这仍然会留下time变量,因此您需要手动删除它:

out$time <- NULL
out
#    V1   V
# 1   1 1.1
# 2   2 2.1
# 3   3 3.1
# 4   4 4.1
# <:::SNIP:::>
# 12  4 4.3
# 13  1 1.4
# 14  2 2.4
# 15  3 3.4
# 16  4 4.4

或者,您可以执行您所做的操作,然后设置row.names(out) <- NULL,而不是使用new.row.names中的reshape参数。

其他方法

在基础R中,另一种方法是使用stack并放弃&#34; ind&#34;列(堆叠数据中的第一列)。然后,将其重新绑定到&#34; id&#34;列。

cbind(mydf[1], stack(mydf[-1])[1])
#    V1 values
# 1   1    1.1
# 2   2    2.1
# 3   3    3.1
# 4   4    4.1
# <:::SNIP:::>
# 12  4    4.3
# 13  1    1.4
# 14  2    2.4
# 15  3    3.4
# 16  4    4.4

或者,正如评论中已经提到的那样,使用来自&#34; reshape2&#34;的melt

install.packages("reshape2") ## if it is not yet installed
library(reshape2)
out2 <- melt(mydf, id.vars="V1")
out2$variable <- NULL
out2
#    V1 value
# 1   1   1.1
# 2   2   2.1
# 3   3   3.1
# 4   4   4.1
# <:::SNIP:::>
# 12  4   4.3
# 13  1   1.4
# 14  2   2.4
# 15  3   3.4
# 16  4   4.4

答案 1 :(得分:0)

如果这是一个数据框,您可以通过melt()轻松地重塑2。类似的东西:

newdata <- melt(data, measure.vars = 1:ncol(data))

这将为您提供“变量”(包含每个列名称)和“值”(包含附加到每个列名称的值)的数据框。

如果您想围绕V1定位数据框,您可能需要melt(data, id.vars = 1, measure.vars = 2:ncol(data))代替。