将熔化操作从tidyverse转换为data.table

将熔化操作从tidyverse转换为data.table,r,data.table,tidyverse,R,Data.table,Tidyverse,我正在使用一个非常宽的表,需要将其转换为更长的格式。通常对于这样的任务,我使用的是tidyverse,但是该表包含大量记录,我希望利用data.table执行此任务 在下面,您可以找到一个示例数据集,其中包含代码的tidyverse版本和使用data.table的版本。 我在将感兴趣的列转换为数字时遇到问题 对于此代码,从tidyverse转换为data.table的正确方法是什么 library(data.table) library(tidyverse) DT = tibble(

我正在使用一个非常宽的表,需要将其转换为更长的格式。通常对于这样的任务,我使用的是tidyverse,但是该表包含大量记录,我希望利用data.table执行此任务

在下面,您可以找到一个示例数据集,其中包含代码的tidyverse版本和使用data.table的版本。 我在将感兴趣的列转换为数字时遇到问题

对于此代码,从tidyverse转换为data.table的正确方法是什么

library(data.table)
library(tidyverse)

DT = tibble(
    year_a = 1999:2020,
    year_b = 1999:2020,
    a = as.character(sample(0:1, 22, replace = TRUE)),
    b = as.character(sample(0:1, 22, replace = TRUE)), 
    c = as.character(sample(0:1, 22, replace = TRUE)),
    d = as.character(sample(0:1, 22, replace = TRUE))
)



# tidyverse version
long_DT <- DT %>%
    filter(year_a >= 2010 & year_b >= 2010) %>%
    mutate(across(a:d, .fns = as.double)) %>%
    pivot_longer(cols      = a:d,
                 names_to  = "letter",
                 values_to = "value") %>%
    clean_names()

dim(long_DT)
long_DT %>% glimpse()

# data.table
setDT(DT)
# the line after is causing problems. How to integrate it into the melt function directly?
DT[, select(.SD, a:d)] <- apply(DT[,select(.SD, a:d)], 2, function(x) as.numeric(x))
DT_long <- melt(data = DT[
                    year_a >= 2010 & year_b >= 2010],
                id.vars = c("year_a", "year_b"),
                variable.name = "letter",
                value.name = "value"
            )
dim(DT_long)
DT_long %>% glimpse()

熔化后可能转换为数字:

res <- melt(DT[year_a >= 2010 & year_b >= 2010, ],
            id.vars = c("year_a", "year_b"),
            variable.name = "letter",
            value.name = "value")[, value := as.numeric(value)]
或者,如果我们必须在熔化前转换为数字:

cols <- colnames(DT)[3:6]
res <- melt(DT[year_a >= 2010 & year_b >= 2010, 
               ][, (cols) := lapply(.SD, as.numeric), .SDcols = cols],
            id.vars = c("year_a", "year_b"),
            variable.name = "letter",
            value.name = "value")

熔化后可能转换为数字:

res <- melt(DT[year_a >= 2010 & year_b >= 2010, ],
            id.vars = c("year_a", "year_b"),
            variable.name = "letter",
            value.name = "value")[, value := as.numeric(value)]
或者,如果我们必须在熔化前转换为数字:

cols <- colnames(DT)[3:6]
res <- melt(DT[year_a >= 2010 & year_b >= 2010, 
               ][, (cols) := lapply(.SD, as.numeric), .SDcols = cols],
            id.vars = c("year_a", "year_b"),
            variable.name = "letter",
            value.name = "value")