r - 如何对数据表的列和行进行复杂的计算?

标签 r data.table

我正在学习操作 data.table 变量的语法。虽然我可以做简单的事情,但对于更复杂的任务,我的理解还不够透彻。例如,我想将以下数据转换为每行有一个不同的“类型”值,根据“子类型”的值生成单独的列,并且当有多行具有相同的“类型/子类型”时折叠唯一值"组合。

给定输入数据:

data = data.frame(
    var1 = c("a","b","c","b","d","e","f"),
    var2 = c("aa","bb","cc","dd","ee","ee","ff"),
    subtype = c("1","2","2","2","1","1","2"),
    type = c("A","A","A","A","B","B","B")
    )

  var1 var2 subtype type
1    a   aa       1    A
2    b   bb       2    A
3    c   cc       2    A
4    b   dd       2    A
5    d   ee       1    B
6    e   ee       1    B
7    f   ff       2    B

我想得出:

  1.var1 1.var2 2.var1 2.var2     2.type
A "a"    "aa"   "b|c"  "bb|cc|dd" "A"   
B "d|e"  "ee"   "f"    "ff"       "B"   

使用数据框,我可以通过以下代码实现这一点:

data.derived = do.call(
    rbind,
    lapply(
        split(data,list(data$type)),
        function(x) {
            do.call (
                c,
                lapply(
                    split(x, list(x$subtype)),
                    function(y) {
                        result = c(
                            var1 = paste(unique(y$var1),collapse ="|"),
                            var2 = paste(unique(y$var2),collapse ="|")
                        )
                        if (as.character(y$subtype[1]) == "2") {
                            result = c(result, type = as.character(y$type[1]))
                        }
                        result}))}))

我如何使用数据表做同样的事情?

最佳答案

从您的结果中,可以清楚地看到您正在将数据从长格式转换为宽格式,并且子类型沿行方向传播,因此您需要 data.table< 中的 dcast/。由于您希望将 var1var2 中的值聚合为单个字符串,因此您需要将聚合函数自定义为 paste 以折叠结果:

library(data.table)
setDT(data)
dcast(data, type ~ subtype, value.var = c("var1", "var2"), 
            fun = function(v) paste0(unique(v), collapse = "|"))

#    type var1_function_1 var1_function_2 var2_function_1 var2_function_2
# 1:    A               a             b|c              aa        bb|cc|dd
# 2:    B             d|e               f              ee              ff

关于r - 如何对数据表的列和行进行复杂的计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38923152/

相关文章:

R - 当用户在不同的页面上时, Shiny 的数据表 (renderDataTable) 重新加载到第一页并更新某个列值 (selectInput)

r - 在 data.table 中按组删除特定时间内相同的连续值

r - 如何确定r中长序列中最长的连续序列

r - 用 R 中的数据拟合自定义回归方程

r - 计算向量的最大版本

r - R中二项式参数的差异

r - 研究原始和内部R函数的源代码: How is R connected with C?

r - 将数据从长数据更改为矩阵

r - 在 data.table 中为缺失值添加行

r - 为什么data.table定义为:= rather than overloading <-?