将熔化操作从tidyverse转换为data.table
我正在使用一个非常宽的表,需要将其转换为更长的格式。通常对于这样的任务,我使用的是tidyverse,但是该表包含大量记录,我希望利用data.table执行此任务 在下面,您可以找到一个示例数据集,其中包含代码的tidyverse版本和使用data.table的版本。 我在将感兴趣的列转换为数字时遇到问题 对于此代码,从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(
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")