将数据帧或矩阵除以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
vsMARGIN=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