0

我在将复杂的数据库输出从宽格式转换为长格式时遇到了麻烦。它有几百行和约 1,000 列。它看起来像这样:

宽df和融化结果

问题是 df1_long 的变量或 df1_wide 的列包含我想要选择的信息。所以我宁愿有这样的东西:

ID       part   task    subgroup    type    result
Ind_A       a     12          aa       2    yes
Ind_A       a     12          bb       2    yes
Ind_A       b     12          aa       3    opt_1
Ind_A       b     13          aa       4    100
Ind_B       a     12          aa       2    no
Ind_B       a     12          bb       2    yes
Ind_B       b     12          aa       3    opt_2
Ind_B       b     13          aa       4    50
Ind_C       a     12          aa       2    no
Ind_C       a     12          bb       2    no
Ind_C       b     12          aa       3    opt_1
Ind_C       b     13          aa       4    200

我不介意将数值/结果转换为字符。

有没有一种简单的方法可以通过 stack() 或 reshape() 函数来实现?或者我是否必须编写一个函数来对列名执行一些 strsplits 命令以提取相关信息,然后将它们存储在单独的新列中。

长格式肯定会更容易使用并向数据集提出问题。用那些神秘的列名称为 >1000 列编码对我来说就像一场噩梦。

4

1 回答 1

4

好的。我屈服了。

这是您的数据:

df1_wide <- data.frame(v1 = c("Ind_A", "Ind_B", "Ind_C"), 
                       v2 = c("Y", "N", "N"), v3 = c("Y", "Y", "N"), 
                       v4 = c("op1_1", "opt_2", "opt_1"), 
                       v5 = c(100, 50, 200))
rownames(df1_wide) <- letters[1:3]
colnames(df1_wide) <- c("ID", "a_t12_aa (Type # 2)", "a_t12_bb (Type # 2)", 
                        "b_t12_aa (Type # 3)", "b_t13_aa (Type # 4)")
df1_wide
#      ID a_t12_aa (Type # 2) a_t12_bb (Type # 2) b_t12_aa (Type # 3) b_t13_aa (Type # 4)
# a Ind_A                   Y                   Y               op1_1                 100
# b Ind_B                   N                   Y               opt_2                  50
# c Ind_C                   N                   N               opt_1                 200

这是你到目前为止所做的:

df1_long <- melt(df1_wide, id.vars="ID")

这就是你想要的:

cbind(df1_long["ID"],
      colsplit(gsub("\\s|\\(Type|\\)|#", " ", df1_long$variable), 
               pattern="_|\\s+", 
               names = c("part", "task", "subgroup", "type")),
      df1_long["value"])
#       ID part task subgroup type value
# 1  Ind_A    a  t12       aa    2     Y
# 2  Ind_B    a  t12       aa    2     N
# 3  Ind_C    a  t12       aa    2     N
# 4  Ind_A    a  t12       bb    2     Y
# 5  Ind_B    a  t12       bb    2     Y
# 6  Ind_C    a  t12       bb    2     N
# 7  Ind_A    b  t12       aa    3 op1_1
# 8  Ind_B    b  t12       aa    3 opt_2
# 9  Ind_C    b  t12       aa    3 opt_1
# 10 Ind_A    b  t13       aa    4   100
# 11 Ind_B    b  t13       aa    4    50
# 12 Ind_C    b  t13       aa    4   200

我不能保证我使用的正则表达式gsub将适用于您的实际数据,但希望这足以为您指明正确的方向。

以后请注意,分享您的数据截图是毫无用处的。请像我在这个问题中所做的那样共享数据,以便其他人可以轻松复制和粘贴以开始尝试帮助您。


您可能希望考虑a_t12_aa_2在将来按照 的方式重命名变量,在这种情况下,colsplit步骤将只是colsplit(variable, "_", c("part", "task", "subgroup", "type"))

于 2013-08-15T17:06:21.120 回答