【发布时间】:2020-01-02 11:28:43
【问题描述】:
我想计算示例数据集DT的所有数值列的绝对值的平均值:
library(data.table)
set.seed(1)
DT <- data.table(panelID = sample(50,50), # Creates a panel ID
Country = c(rep("Albania",30),rep("Belarus",50), rep("Chilipepper",20)),
some_NA = sample(0:5, 6),
some_NA_factor = sample(0:5, 6),
Group = c(rep(1,20),rep(2,20),rep(3,20),rep(4,20),rep(5,20)),
Time = rep(seq(as.Date("2010-01-03"), length=20, by="1 month") - 1,5),
norm = round(runif(100)/10,2),
Income = round(rnorm(10,-5,5),2),
Happiness = sample(10,10),
Sex = round(rnorm(10,0.75,0.3),2),
Age = sample(100,100),
Educ = round(rnorm(10,0.75,0.3),2))
DT [, uniqueID := .I] # Creates a unique ID
DT[DT == 0] <- NA # https://stackoverflow.com/questions/11036989/replace-all-0-values-to-na
DT$some_NA_factor <- factor(DT$some_NA_factor)
我尝试计算均值和绝对均值如下:
mean_of_differences <- DT[,lapply(Filter(is.numeric,.SD),mean, na.rm=TRUE)]
mean_of_differences <- as.data.frame(t(mean_of_differences))
mean_of_differences <- round(mean_of_differences, digits=2)
mean_of_absolute_diff <- DT[,lapply(Filter(is.numeric,.SD),function(x) mean(abs(x),na.rm=TRUE))]
mean_of_absolute_diff <- as.data.frame(t(mean_of_absolute_diff))
mean_of_absolute_diff <- round(mean_of_differences, digits=2)
然而,绝对差异的收入平均值是负数(因为它是正态平均值),这显然是不可能的。如果我查看我的代码,我不明白我做错了什么。我忽略了什么?
【问题讨论】:
-
绝对的手段是给我的。然而,我没有使用
as.data.frame运行这些部分,尽管我认为这不会产生影响。 -
这很奇怪。我在多个数据集上遇到过这个问题。有没有我可以尝试的替代方法来实现这一目标?
-
用
dplyr试试这个(用DT作为data.table对象):DT %>% summarise_if(is.numeric, function(x) mean(abs(x), na.rm=TRUE)) -
dplyr代码有效。不过非常奇怪(而且很烦人)。 -
@NelsonGon 的 dplyr-code 与 Tom 的 data.table-code 相同。
标签: r data.table lapply mean absolute-value