data.table中的长到宽数据重组

时间:2016-05-25 10:00:33

标签: r data.table

我有一个data.table,格式很长,我想把它重新组织成宽格式。与SPSS中的vars类似的东西。我有使用融化

以长格式创建的数据
library(data.table)
set.seed(71)
DT <- data.table(town = rep(c('A','B'), each=17),
                 tc = rep(c('C','D'), 17),
                 one = rnorm(34,1,1),
                 two = rnorm(34,2,1),
                 three = rnorm(34,3,1),
                 four = rnorm(34,4,1),
                 five = rnorm(34,5,2),
                 six = rnorm(34,6,2),
                 seven = rnorm(34,7,2),
                 eight = rnorm(34,28,3))

DT1 <- melt(DT, id.vars = c("town","tc"),measure=3:10)

DT1[, `:=` (mn = mean(value,na.rm = TRUE), sdev = sd(value,na.rm = TRUE), uplimit = mean(value,na.rm = TRUE)+1.96*sd(value,na.rm = TRUE), lowlimit=mean(value,na.rm = TRUE)-1.96*sd(value,na.rm = TRUE)), by = .(town,tc,variable)][, outlier := +(value < mn - 1.96*sdev | value > mn + 1.96*sdev)]

所以最初数据有34条记录,我们有8个关键变量&#34;一个&#34;到&#34;八&#34;。使用融合我们得到的数据类似于上面的代码和列#34;值&#34;保存原始数据中的数据。现在根据这些数据我们做一些计算并创建其他变量&#34; mn&#34;,&#34; sd&#34;,&#34; up&#34;,&#34; low&#34;,& #34;列&#34 ;.现在,这些数据需要与仅有34条记录的原始数据合并。所以我想重新构造这些数据,以便重组后的数据有34条记录和8条变量,分别用于&#34; mn&#34;,&#34; sd&#34;,&#34; uplimit&#34;,& #34; lowlimit&#34;,&#34; out&#34;。我怎样才能做到这一点?我正在尝试dcast但不太清楚~+如何在公式中使用.....在dcast和其他说明中没有明确提到。你有什么可以分享的东西,用一个例子解释这个。是否可以使用dcast实现这一要求?

1 个答案:

答案 0 :(得分:0)

最后我在多次尝试后找到了我的问题的答案。因此,基本上要注意的关键是原始数据必须具有唯一的ID标识符,在这种情况下不存在。所以我在变量&#34; unique&#34;。

的末尾添加了连续的唯一数字
library(data.table)
set.seed(71)
DT <- data.table(town = rep(c('A','B'), each=17),
                 tc = rep(c('C','D'), 17),
                 one = rnorm(34,1,1),
                 two = rnorm(34,2,1),
                 three = rnorm(34,3,1),
                 four = rnorm(34,4,1),
                 five = rnorm(34,5,2),
                 six = rnorm(34,6,2),
                 seven = rnorm(34,7,2),
                 eight = rnorm(34,28,3),
                 unique = 1:34)

这包含一个包含uniqueID的列的数据。然后在以长格式转换数据时,我也在融化中使用了这个独特的变量。

DT1 <- melt(DT, id.vars = c("town","tc","unique"),measure=3:10)

然后创建了所需的新变量

DT1[, `:=` (mn = mean(value,na.rm = TRUE), sdev = sd(value,na.rm = TRUE), uplimit = mean(value,na.rm = TRUE)+1.96*sd(value,na.rm = TRUE), lowlimit=mean(value,na.rm = TRUE)-1.96*sd(value,na.rm = TRUE)), by = .(town,tc,variable)][, outlier := +(value < mn - 1.96*sdev | value > mn + 1.96*sdev)]

然后,当将这个长数据转换为宽格式以便我有与原始数据中相同数量的记录时,我已经在 dcast

中获取了这个唯一变量的帮助
DT2 <- dcast(DT1,town+tc+unique~variable,value.var = c("mn","sdev","outlier","uplimit","lowlimit"))

这为我提供了与原始数据中相同数量的记录(34)的所需输出,并创建了所需数量的列,每个单元格具有与长格式相同的数据。

我希望你们都觉得这很有用:)!!