想要根据因子列获取偏离平均值的值的数据框
Want to get the dataframe of values that are deviations from the mean based on a factor column
示例:
假设我有这个数据框。
x = data.frame(factor = as.factor(c('a','a','b','b','c','c')),value1 = c(1,3,2,4,5,3), value2 = c(7,9,3,4,9,3))
factor value1 value2
1 a 1 7
2 a 3 9
3 b 2 3
4 b 4 4
5 c 5 9
6 c 3 3
我知道如何获得每个因素的平均值,我使用这种方法:
aggregate(x[,c(2,3)], list(x$factor), mean, na.rm = T )
这给我以下输出:
Group.1 value1 value2
1 a 2 8.0
2 b 3 3.5
3 c 4 6.0
我现在如何从原始数据框中的每个值中减去其因子的相应平均值。我使用的实际数据集很大,所以需要一个好的方法,我已经设法做到了,但是我使用了复杂的 for 循环。
所以我想要的输出是:
factor value1 value2
1 a -1 -1.0
2 a 1 1.0
3 b -1 -0.5
4 b 1 0.5
5 c 1 3.0
6 c -1 -3.0
任何帮助都会很棒。谢谢
您可以试试这个dplyr
方法:
library(dplyr)
#Data
x = data.frame(factor = as.factor(c('a','a','b','b','c','c')),value1 = c(1,3,2,4,5,3), value2 = c(7,9,3,4,9,3))
#Code
x <- x %>% group_by(factor) %>%
mutate(Mv1=mean(value1),
Mv2=mean(value2),
value1=value1-Mv1,
value2=value2-Mv2) %>% select(-c(Mv1,Mv2))
输出:
# A tibble: 6 x 3
# Groups: factor [3]
factor value1 value2
<fct> <dbl> <dbl>
1 a -1 -1
2 a 1 1
3 b -1 -0.5
4 b 1 0.5
5 c 1 3
6 c -1 -3
一个dplyr
解决方案
library(dplyr)
x %>% group_by(factor) %>% mutate(across(c(value1, value2), ~. - mean(.)))
输出
# A tibble: 6 x 3
# Groups: factor [3]
factor value1 value2
<fct> <dbl> <dbl>
1 a -1 -1
2 a 1 1
3 b -1 -0.5
4 b 1 0.5
5 c 1 3
6 c -1 -3
这是 data.table
的解决方案
library("data.table")
setDT(x)
cols <- paste0("value", 1:2)
x[, lapply(.SD, function(x) x - mean(x)), .SDcols=cols, by=factor]
或
library("data.table")
setDT(x)
x[, sweep(.SD, 2, STATS=colMeans(.SD)), by=factor, .SDcols=2:3]
示例:
假设我有这个数据框。
x = data.frame(factor = as.factor(c('a','a','b','b','c','c')),value1 = c(1,3,2,4,5,3), value2 = c(7,9,3,4,9,3))
factor value1 value2
1 a 1 7
2 a 3 9
3 b 2 3
4 b 4 4
5 c 5 9
6 c 3 3
我知道如何获得每个因素的平均值,我使用这种方法:
aggregate(x[,c(2,3)], list(x$factor), mean, na.rm = T )
这给我以下输出:
Group.1 value1 value2
1 a 2 8.0
2 b 3 3.5
3 c 4 6.0
我现在如何从原始数据框中的每个值中减去其因子的相应平均值。我使用的实际数据集很大,所以需要一个好的方法,我已经设法做到了,但是我使用了复杂的 for 循环。
所以我想要的输出是:
factor value1 value2
1 a -1 -1.0
2 a 1 1.0
3 b -1 -0.5
4 b 1 0.5
5 c 1 3.0
6 c -1 -3.0
任何帮助都会很棒。谢谢
您可以试试这个dplyr
方法:
library(dplyr)
#Data
x = data.frame(factor = as.factor(c('a','a','b','b','c','c')),value1 = c(1,3,2,4,5,3), value2 = c(7,9,3,4,9,3))
#Code
x <- x %>% group_by(factor) %>%
mutate(Mv1=mean(value1),
Mv2=mean(value2),
value1=value1-Mv1,
value2=value2-Mv2) %>% select(-c(Mv1,Mv2))
输出:
# A tibble: 6 x 3
# Groups: factor [3]
factor value1 value2
<fct> <dbl> <dbl>
1 a -1 -1
2 a 1 1
3 b -1 -0.5
4 b 1 0.5
5 c 1 3
6 c -1 -3
一个dplyr
解决方案
library(dplyr)
x %>% group_by(factor) %>% mutate(across(c(value1, value2), ~. - mean(.)))
输出
# A tibble: 6 x 3
# Groups: factor [3]
factor value1 value2
<fct> <dbl> <dbl>
1 a -1 -1
2 a 1 1
3 b -1 -0.5
4 b 1 0.5
5 c 1 3
6 c -1 -3
这是 data.table
library("data.table")
setDT(x)
cols <- paste0("value", 1:2)
x[, lapply(.SD, function(x) x - mean(x)), .SDcols=cols, by=factor]
或
library("data.table")
setDT(x)
x[, sweep(.SD, 2, STATS=colMeans(.SD)), by=factor, .SDcols=2:3]