将数据帧或矩阵除以R中的向量

将数据帧或矩阵除以R中的向量,r,scale,normalization,division,R,Scale,Normalization,Division,这似乎不应该太难,但我很难接受。例如,假设我有以下数据帧: set.seed(99) data <- data.frame(Names=rep(c('A','B'),5), First = rnorm(10), Second = rnorm(10), Third = rnorm(10)) set.seed(99) 资料 我还喜欢子集(data,Names=='A')的可读性(

这似乎不应该太难,但我很难接受。例如,假设我有以下数据帧:

set.seed(99)
data <- data.frame(Names=rep(c('A','B'),5),
                   First = rnorm(10),
                   Second = rnorm(10),
                   Third = rnorm(10))
set.seed(99)
资料
我还喜欢
子集(data,Names=='A')
的可读性(尽管不建议编程:请参阅)

set.seed(99)

数据哦,没关系,你不是在按你认为的方式划分。将矩阵除以值向量并不会将每列除以给定值

Rgames> foo
     [,1] [,2] [,3]
[1,]    5    3    7
[2,]    5    3    7
[3,]    5    3    7
[4,]    5    3    7
[5,]    5    3    7
Rgames> foo/c(1,2,3)
         [,1] [,2]     [,3]
[1,] 5.000000  1.0 3.500000
[2,] 2.500000  3.0 2.333333
[3,] 1.666667  1.5 7.000000
[4,] 5.000000  1.0 3.500000
[5,] 2.500000  3.0 2.333333

因为您从未使用
B
数据,所以让我们去掉它注意最后一行中的输入错误。计算的是原始数据的平均值,而不是标准化数据的平均值。确切地说,除数是循环的。这就是为什么您可以简单地转置foo以获得所需的结果。与双转置除法相比,使用sweep有优势吗?我发现它更可读,并且它同样适用于行或列操作(通过使用
MARGIN=1
vs
MARGIN=2
),但我认为性能没有太大差异(甚至可能稍微慢一点)。
set.seed(99)
data <- data.frame(Names=rep(c('A','B'),5),
                   First = rnorm(10),
                   Second = rnorm(10),
                   Third = rnorm(10))

a.mean <- sapply(data[data$Names == 'A', 2:4], mean)
data[,2:4] <- sweep(data[,2:4],MARGIN=2,a.mean,"/")

(norm.mean <- sapply(data[data$Names == 'A', 2:4], mean))
## First Second  Third 
##     1      1      1 
data <- data.frame(First = rnorm(10),
                   Second = rnorm(10),
                   Third = rnorm(10),
                   row.names=rep(c('A','B'),5))
set.seed(99)
data <- data.frame(Names=rep(c('A','B'),5),
                   First = rnorm(10),
                   Second = rnorm(10),
                   Third = rnorm(10))

a.mean <- colMeans(data[data$Names == 'A', 2:4])


normalized.data <- as.data.frame(t(t(data[,2:4])/a.mean))


normalized.data$Names <- data$Names
colMeans(normalized.data[normalized.data$Names == 'A', 1:3])

#First Second  Third 
#1      1      1 
Rgames> foo
     [,1] [,2] [,3]
[1,]    5    3    7
[2,]    5    3    7
[3,]    5    3    7
[4,]    5    3    7
[5,]    5    3    7
Rgames> foo/c(1,2,3)
         [,1] [,2]     [,3]
[1,] 5.000000  1.0 3.500000
[2,] 2.500000  3.0 2.333333
[3,] 1.666667  1.5 7.000000
[4,] 5.000000  1.0 3.500000
[5,] 2.500000  3.0 2.333333