【问题标题】:Custom dcasting via data.table in R通过 R 中的 data.table 自定义 dcast
【发布时间】:2020-10-01 12:56:15
【问题描述】:

这是我的数据

dt = data.table(x=sample(8,20,TRUE), 
                y=sample(2,20,TRUE), 
                w = sample(letters[5:20], 20, TRUE),
                u = sample(letters[2:25], 20, TRUE),
                z=sample(letters[1:4], 20,TRUE), 
                d1 = runif(20), d2=runif(20))

这是我的 dcasting 代码。

DC_1 = dcast.data.table(dt,x+w ~ z, value.var = "d1")

这很好用。但是,我的数据还可以另外包括“a”列和“s”列,如下所示。它们都可以包括在内,或者一个,或者一个都不包括。

dt = data.table(x=sample(8,20,TRUE), 
                y=sample(2,20,TRUE), 
                w = sample(letters[5:20], 20, TRUE),
                u = sample(letters[2:25], 20, TRUE),
                z=sample(letters[1:4], 20,TRUE), 
                a = sample(letters[1:25], 20, T),
                s = sample(letters[2:17], 20, T),
                d1 = runif(20), d2=runif(20))

然而,额外的列总是 characters 。此外,我的数据总是必须在列“z”上转换,值变量总是“d1”

我如何通过 data.table 进行 dcast,以便它获取数据表中可用的所有字符列(z 除外)并将它们转换到 z 上?

【问题讨论】:

    标签: r data.table reshape dcast


    【解决方案1】:

    我们可以对数据集列进行子集化,并在 ~ 的 lhs 上使用 ... 来指定所有列,并在公式的 rhs 上使用 'z'

    dcast(dt[, setdiff(names(dt), 'd2'), with = FALSE], ... ~ z, value.var = 'd1')
    

    或者以编程方式获取字符列的列名

    nm1 <- dt[, names(which(unlist(lapply(.SD, is.character))))]
    nm2 <- setdiff(nm1, 'z')
    dcast(dt,paste0(paste(nm2, collapse="+"), "~ z"), value.var = 'd1')
    

    或者另一个选项是来自dplyrselect

    library(dplyr) #1.0.0
    dcast(dt[, select(.SD, where(is.character), d1)], ... ~ z, value.var = 'd1')
    

    tidyverse 中的类似选项是

    library(tidyr)
    dt %>% 
       select(where(is.character), d1) %>% 
       pivot_wider(names_from = z, values_from = d1)
    

    【讨论】:

    • 没有@akrun。没有重复的元素,这完全是巧合。已使列内容独一无二以避免混淆。
    • @Manasi 你能指定set.seed 以及你的预期输出吗
    • 我已将种子设置为 2。当 a 和 s 也存在时,需要运行的预期公式是 DC_1 = dcast.data.table(dt,x+w+a+s ~ z, value.var = "d1")
    • 无法对子集进行用户干预,因为它作为函数的一部分运行。有什么方法可以子集除 z 之外的所有字符列?
    猜你喜欢
    • 1970-01-01
    • 2019-09-13
    • 2016-10-12
    • 2017-11-05
    • 1970-01-01
    • 2019-11-05
    • 1970-01-01
    • 2016-02-15
    • 2021-01-13
    相关资源
    最近更新 更多