编辑 - 这个问题最初的标题是"R中的长到宽数据重塑"
我只是在学习R并试图找到方法来应用它来帮助我生命中的其他人.作为一个测试用例,我正在努力重塑一些数据,而且我在跟踪我在网上发现的例子时遇到了麻烦.我开始的是这样的:
ID Obs 1 Obs 2 Obs 3
1 43 48 37
1 27 29 22
1 36 32 40
2 33 38 36
2 29 32 27
2 32 31 35
2 25 28 24
3 45 47 42
3 38 40 36
Run Code Online (Sandbox Code Playgroud)
而我想要最终得到的将是这样的:
ID Obs 1 mean Obs 1 std dev Obs 2 mean Obs 2 std dev
1 x x x x
2 x x x x
3 x x x x
Run Code Online (Sandbox Code Playgroud)
等等.我不确定的是我是否需要在长篇数据中提供更多信息,或者是什么.我想,数学部分(找到平均值和标准偏差)将是容易的部分,但我找不到一种似乎能够正确地重塑数据以开始该过程的方法.
非常感谢您的帮助.
我试图通过分组变量将多个功能应用于多个列。我可以获得结果,但是没有有用的格式。在下面,我希望res2是by变量by“ cyl”的res1的扩展,并且与cyl的唯一值一样多。
我尝试省略unlist并重新定义my.sum.function以返回数字而不是列表。但是我无法获得所需的格式。
library(data.table)
## The well known data
data(mtcars)
DT <- data.table(mtcars)
## a custom set of summary functions
my.sum.fun = function(x){list(
mean = mean(x, na.rm=T),
median = median(x, na.rm=T),
sd = sd(x, na.rm=T)
)}
## I can summarize multiple columns. This works
res1 <- DT[,unlist(lapply(.SD,my.sum.fun)),.SDcols=c("mpg","hp")]
res1
mpg.mean mpg.median mpg.sd hp.mean hp.median hp.sd
20.090625 19.200000 6.026948 146.687500 123.000000 68.562868
## Now I add a by column. What I would like is the format as res1 but with the by …Run Code Online (Sandbox Code Playgroud) 我想使用data.table的lapply(.SD, ...)方法执行多个聚合,即计算几个变量的几个不同的汇总统计数据.但我的猜测是如何以错误或相当于rbind而不是错误的方式结束cbind.
例如,要通过cyl获得mtcars的平均值和中位数mpg,可以执行以下操作:
mtcars.dt <- data.table(mtcars)
mtcars.dt[, list(mpg.mean = mean(mpg), mpg.median = median(mpg)), by = "cyl"]
# Result:
cyl mpg.mean mpg.median
|1: 6 19.74 19.7
|2: 4 26.66 26.0
|3: 8 15.10 15.2
Run Code Online (Sandbox Code Playgroud)
但是应用这种.SD方法可以解决这些问题:
mtcars.dt[, lapply(.SD, function(x) list(mean(x), median(x))),
by = "cyl", .SDcols = c("mpg")]
# Result:
cyl mpg
1: 6 19.7428571428571
2: 6 19.7
3: 4 26.6636363636364
4: 4 26
5: 8 15.1
6: 8 15.2
Run Code Online (Sandbox Code Playgroud)
或完全打破:
mtcars.dt[, lapply(.SD, list(mean, median)), …Run Code Online (Sandbox Code Playgroud)