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

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

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

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

1回复

重塑错误 - 'row.names'长度无效

我有以下数据库(宽格式),“st_all”,我有两个变量我希望重塑(“P”和“PLC”)。 主题的id是“g_id”。 为此,我运行了以下代码: 我收到以下错误: 我已经找到了答案,但我找不到。 提前致谢。
2回复

reshape()错误:不允许重复的“行名”

我有广泛的纵向数据,我想将其重塑为长数据。 这是一个示例: 我需要以与SPELL格式兼容的形状来获得它: 我正在使用以下命令: 我收到以下错误消息: 我曾尝试通过这种方式将NA值设置为999,但它不起作用。 您知道什么可以使它正常工作吗? 非常感谢!
3回复

通过在R中重新出现列名称,从宽到长重塑数据框架

我正在尝试使用融合公式将数据框从宽格式转换为长格式。 挑战在于我有多个标记相同的列名。 当我使用熔化函数时,它会从重复列中删除值。 我已经阅读了类似的问题,建议使用重塑功能,但我无法使其工作。 要重现我的起始数据框: 数据框如下所示: 当我运行以下融化功能时:
3回复

当重塑不能猜出时变变量的名称时,重新形成r中的数据

我有一个宽大的数据集,超过1500列。 由于许多变量都是重复的,我想重塑成长形。 但是,r抛出一个错误: 试着通过玩具示例来理解这一点,我发现了这一点 工作正常。 但是,我的数据看起来更像是: 这就是我失去的地方。 任何聪明的想法,除了更改变量名称(这是累人的),
1回复

根据R中的行值对行进行转置/重塑

我有以下数据。 我想使用第1列中的ID值来转置数据,以便将每个唯一ID号的数据从行转置为列,即 每个ID号需要转置的行数范围是1-7。 非常感谢R新手提供的任何帮助。
2回复

在reshape()或stack()中重复列

我有这个df : 我想使用reshape()或stack来获取另一个data.frame如下所示: 其中Category显示来自df的列( Total或Subtotal ),而Price按以下方式显示:在df显示的Total , Subtotal , Tax 。 到目前为止
1回复

重塑R中的矩阵并将每n行转换为一行

我有一个数据框df像: 我想重塑它 我可以做一个hack,并连接前两列,然后执行 d <- matrix(df, nrow = 70, byrow = FALSE) 但是,稍后我又不得不拆分连接的内容,是否有一种巧妙的方法?
1回复

在R中重塑与reshape2

我试图理解为什么开发已经从reshape转变为reshape2包。 它们似乎在功能上是相同的,但是,由于服务器上运行的旧版本的R,我无法升级到reshape2 。 我担心一个重大错误的可能性会将开发转移到一个全新的包,而不是简单地继续开发reshape 。 有谁知道reshape包装中是否
1回复

重塑数据框,其中列名是初始数据框中的单个变量[重复]

这个问题已经在这里有了答案: 如何在R中拆分列? [重复] 3个答案 关于应该如何转置或重塑数据框架的任何想法: 对此: 我试图将第二列更改为列名,并保持timestamp和ht记录成对。 *标题需要一些工作,如果有人有更好的主意,我很乐于尝
3回复

在R中从宽到长重塑,其中id和id的值在同一行中

我无法将数据集重新整形为面板数据集。 我的df看起来如下 我想重塑一下,看起来如下 我经常从长到长重塑,但不知怎的,我的脑袋无法解决这个问题。