我认为我非常接近解决方案,我只需要在正确的方向上指点几点,我非常感谢你把它拉直!

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

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”]表示“未选择未定义的列”。

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

===============>>#1 票数:2

你描述的行为......

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

这是一个小例子:

## 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

在此输入图像描述

View(df1) # RStudio data viewer

在此输入图像描述

fix(df2)

在此输入图像描述

View(df2)

在此输入图像描述

按照您的预期reshape工作

其次,base 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而不是使用reshapenew.row.names参数。

其他方法

在基础R中,另一种方法是使用stack并且只删除“ind”列(这是堆叠数据中的第一列)。 然后,将其绑定到“id”列。

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

另外,如已经在评论中提到的,使用melt从“reshape2”:

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

===============>>#2 票数:0

如果这是一个数据框,你可以通过melt()轻松地重塑2。 就像是:

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

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

如果要围绕V1定位melt(data, id.vars = 1, measure.vars = 2:ncol(data)) ,可能需要melt(data, id.vars = 1, measure.vars = 2:ncol(data))

  ask by user3552980 translate from so

未解决问题?本站智能推荐: