具有多个名称模式的pivot_longer的melt等效项

64jmpszr  于 2023-10-13  发布在  其他
关注(0)|答案(2)|浏览(111)

我目前正在用data.table语法翻译一个应用程序,遇到了一个pivot_longer,其中列名根据模式分为两列:

library(data.table)
library(tidyr)

dt <- data.table(id = 1:5, abc_123 = runif(5), def_456 = runif(5))
dt %>% pivot_longer(-id, names_pattern = "(.*)_(.*)", names_to = c("char", "num"))

# A tibble: 10 × 4
#      id char  num     value
#   <int> <chr> <chr>   <dbl>
# 1     1 abc   123   0.902  
# 2     1 def   456   0.763  
# 3     2 abc   123   0.00490
# 4     2 def   456   0.471  
# 5     3 abc   123   0.647  
# 6     3 def   456   0.742  
# 7     4 abc   123   0.730  
# 8     4 def   456   0.0154 
# 9     5 abc   123   0.207  
#10     5 def   456   0.764

我尝试为measure.vars = patterns()提供模式,但是,似乎在melt中只有值可以分隔到不同的列中,而不是变量名。
有没有一种类似的方法可以用data.table来实现?

rkkpypqq

rkkpypqq1#

IIRC,(变量)名称的分离只能在data.table的开发版本中在melt中完成。
你可以通过运行data.table::update_dev_pkg()来安装一个dev版本。

使用dev版本

melt(dt, id="id", measure=measure(char, num, pattern="(.*)_(.*)"))

如果你想把num转换成一个数值变量,那么你可以使用as.numeric(同样的逻辑适用于char,如果你想把它转换成一个因子)。新代码将成为

melt(dt, id="id", measure=measure(char, num=as.numeric, pattern="(.*)_(.*)"))

#        id   char   num      value
#     <int> <char> <num>      <num>
#  1:     1    abc   123 0.08764793
#  2:     2    abc   123 0.21928681
#  3:     3    abc   123 0.07032364
#  4:     4    abc   123 0.67780733
#  5:     5    abc   123 0.80658605
#  6:     1    def   456 0.43035816
#  7:     2    def   456 0.41987074
#  8:     3    def   456 0.70536835
#  9:     4    def   456 0.14457836
# 10:     5    def   456 0.53833383

使用发布版本

melt(dt, id="id", measure=patterns("_")) |> 
  _[, c("char", "num") := tstrsplit(variable, "_", type.convert=TRUE)] |> 
  _[, variable := NULL]
enyaitl3

enyaitl32#

我不认为melt单独可以做到这一点,但你可以尝试tstrsplit沿着它。
我希望这应该接近pivot_longer所做的

melt(dt, id = "id")[
    ,
    c("char", "num") := tstrsplit(variable, "_")
][
    ,
    variable := NULL
][]

这给

id     value char num
 1:  1 0.8966972  abc 123
 2:  2 0.2655087  abc 123
 3:  3 0.3721239  abc 123
 4:  4 0.5728534  abc 123
 5:  5 0.9082078  abc 123
 6:  1 0.2016819  def 456
 7:  2 0.8983897  def 456
 8:  3 0.9446753  def 456
 9:  4 0.6607978  def 456
10:  5 0.6291140  def 456

相关问题