【问题标题】:Melt and cast data table using pattern使用模式的熔铸数据表
【发布时间】:2016-01-27 21:18:08
【问题描述】:

data.table 包为melt 数据同时添加到多个列中添加了一项新功能。这非常有用,但我不知道如何保留预熔变量名称的“后缀”。例如:

library(data.table)

# create data table
dt <- data.table(id = seq(3), a_3 = seq(3), a_4 = seq(4, 6), b_3 = seq(7, 9), b_4 = seq(10, 12))

# melt and cast in one step using new feature
m1 <- melt(dt, id.vars='id', measure=patterns("a_", "b_"), value.name=c("a_", "b_"))

数据表中的结果:

   id variable a_ b_
1:  1        1  1  7
2:  2        1  2  8
3:  3        1  3  9
4:  1        2  4 10
5:  2        2  5 11
6:  3        2  6 12

这是我想要的“形状”,但变量a_3、a_4、b_3 和b_4 已被索引1 和2。我想要的是variable 列包含3,3,3,4,4,4,根据变量名的后缀。

我显然可以使用melt、strsplit、dcast 以“老式”方式执行此操作,但这有点麻烦。我希望有一个仍然非常快的单线解决方案。

【问题讨论】:

标签: r data.table


【解决方案1】:

我们可以通过splitstackshape 做到这一点。它会自动给出“.time_1”列

library(splitstackshape)
merged.stack(dt, var.stubs=c("a", "b"), sep="_")
#   id .time_1 a  b
#1:  1       3 1  7
#2:  1       4 4 10
#3:  2       3 2  8
#4:  2       4 5 11
#5:  3       3 3  9
#6:  3       4 6 12

【讨论】:

    【解决方案2】:

    为什么不只是:

    > m1[ , variable:= c(3,4)[variable] ]
    > m1
       id variable a_ b_
    1:  1        3  1  7
    2:  2        3  2  8
    3:  3        3  3  9
    4:  1        4  4 10
    5:  2        4  5 11
    6:  3        4  6 12
    

    【讨论】:

    • 这行得通。我正在避免这样的事情,因为在我的真实情况下,我有数千个变量并且不想列出它们的所有后缀是什么。我想我可以在变量名列表中使用gsub 来隔离所有后缀,但是它已经非常接近melt、strsplit、dcast 方法中的工作量......
    • c(3,4) 可以替换为sub("^a_", "", names(dt)[grepl("^a_", names(dt))]),如果不是这样自然可能需要排序。
    • 谢谢。这是我试图避免的那种令人费解的事情。我的变量后缀是不一定排序的字符串,而且有很多。我希望有一种“自然”的方式来使用melt.data.table 的这个功能,但我可以暗示没有。无论如何感谢您的帮助!
    • 我觉得你只需要对一个变量做,否则重排没有意义。
    猜你喜欢
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 2014-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多