我正在尝试使用分解公式将数据框从宽格式转换为长格式。挑战在于,我有多个标记为相同的列名。当我使用melt函数时,它将删除重复列中的值。我已经阅读过类似的问题,建议使用重塑功能,但是我无法使其正常工作。

要重现我的起始数据帧:

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函数时:
melt.df<-melt(df,id="conversion.id")

它删除了interact.num == 2列,看起来像这样:

我想要的数据帧如下:

我看到了以下文章,但是我对reshape函数不太熟悉,无法使其正常工作。

How to reshape a dataframe with "reoccurring" columns?

为了增加一层复杂性,我正在寻找一种有效的方法。我需要在大约100万行的数据帧上执行此操作,其中许多列标记为相同。

任何建议将不胜感激!

最佳答案

这是使用tidyr而不是reshape2的解决方案。优点之一是gather_函数,该函数将字符向量作为输入。因此,首先我们可以用唯一的名称替换所有“有问题的”变量名称(通过在每个名称的末尾添加数字),然后收集(等效于熔化)这些特定的变量。变量的唯一名称存储在名为“prob_var_name”的临时变量中,我在最后将其删除。

library(tidyr)
library(dplyr)

var_name <- "interaction.num"

problem_var <- df %>%
  names %>%
  equals(var_name) %>%
  which

replaced_names <- mapply(paste0,names(df)[problem_var],seq_along(problem_var))

names(df)[problem_var]  <- replaced_names

df %>%
  gather_("prob_var_name",var_name,replaced_names) %>%
  select(-prob_var_name)

  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

借助gather_的引用功能,您可以将所有这些包装到函数中并将var_name设置为变量。然后,也许您可​​以在所有重复的变量上使用它?

10-04 23:20
查看更多