使用在R中重新出现的列名从宽到长重塑数据框 [英] Reshape data frame from wide to long with re-occuring column names in R

查看:7
本文介绍了使用在R中重新出现的列名从宽到长重塑数据框的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用熔化公式将数据框从宽格式转换为长格式。挑战在于我有多个标签相同的列名。当我使用MILL函数时,它会从重复列中删除值。我读过类似的问题,有人建议我使用重塑功能,但我无法让它工作。

要复制我的起始数据框:

conversion.id<-c("1", "2", "3")
interaction.num<-c("1","1","1")
interaction.num2<-c("2","2","2")
conversion.id<-as.data.frame(conversion.id)
interaction.num<-as.data.frame(interaction.num)
interaction.num2<-as.data.frame(interaction.num2)
conversion<-c(rep("1",3))
conversion<-as.data.frame(conversion)
df<-cbind(conversion.id,interaction.num, interaction.num2, conversion)
names(df)[3]<-"interaction.num"

数据框如下所示:

当我运行以下熔化函数时:

melt.df<-melt(df,id="conversion.id")

它删除interaction.num==2列,如下所示:

我想要的数据框如下:

我看到了下面的帖子,但我不太熟悉重塑功能,无法让它工作。

How to reshape a dataframe with "reoccurring" columns?

为了增加复杂性,我正在寻找一种高效的方法。我需要在一个数据框上执行此操作,该数据框大约有1M行,许多列被标记为相同的。

如有任何建议,我们将不胜感激!

推荐答案

以下是使用data.table的解决方案。您只需提供索引,而不是名称。

require(data.table)
require(reshape2)
ans <- melt(setDT(df), measure=2:3, 
           value.name="interaction.num")[, variable := NULL]

#    conversion.id conversion interaction.num
# 1:             1          1               1
# 2:             2          1               1
# 3:             3          1               1
# 4:             1          1               2
# 5:             2          1               2
# 6:             3          1               2
您可以通过执行grep("interaction.num", names(df))获取索引2:3

这篇关于使用在R中重新出现的列名从宽到长重塑数据框的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆