通过向量将数据帧中的列相乘

11 r

我想要做的是将data.frame的第1列中的所有值乘以向量中的第一个元素,然后将第2列中的所有值乘以向量中的第2个元素,等等......

c1 <- c(1,2,3)
c2 <- c(4,5,6)
c3 <- c(7,8,9)
d1 <- data.frame(c1,c2,c3)

  c1 c2 c3
1  1  4  7
2  2  5  8
3  3  6  9

v1 <- c(1,2,3)
Run Code Online (Sandbox Code Playgroud)

结果如下:

  c1  c2  c3
1  1  8   21
2  2  10  24
3  3  12  27
Run Code Online (Sandbox Code Playgroud)

我可以一次只做一列,但如果我有100列呢?我希望能够以编程方式执行此操作.

Ton*_*oni 8

或者简单地对矢量化,使每个行条目乘以v1中的相应元素:

c1 <- c(1,2,3)
c2 <- c(4,5,6)
c3 <- c(7,8,9)
d1 <- as.matrix(cbind(c1,c2,c3))
v1 <- c(1,2,3)

d1%*%diag(v1)

     [,1] [,2] [,3]
[1,]    1    8   21
[2,]    2   10   24
[3,]    3   12   27
Run Code Online (Sandbox Code Playgroud)


akr*_*run 8

我们也可以复制向量使长度相等然后相乘

d1*v1[col(d1)]
#  c1 c2 c3
#1  1  8 21
#2  2 10 24
#3  3 12 27
Run Code Online (Sandbox Code Playgroud)

或使用 sweep

sweep(d1, 2, v1, FUN="*")
Run Code Online (Sandbox Code Playgroud)

或与mapply'data.frame' 的相应列和 'vector' 的元素相乘

mapply(`*`, d1, v1)
Run Code Online (Sandbox Code Playgroud)


小智 6

转置数据框有效.

c1 <- c(1,2,3)
c2 <- c(4,5,6)
c3 <- c(7,8,9)
d1 <- data.frame(c1,c2,c3)
v1 <- c(1,2,3)
t(t(d1)*v1)
#     c1 c2 c3
#[1,]  1  8 21
#[2,]  2 10 24
#[3,]  3 12 27
Run Code Online (Sandbox Code Playgroud)

编辑:如果所有列都不是数字,您可以执行以下操作

c1 <- c(1,2,3)
c2 <- c(4,5,6)
c3 <- c(7,8,9)
d1 <- data.frame(c1,c2,c3)

# Adding a column of characters for demonstration
d1$c4 <- c("rr", "t", "s")

v1 <- c(1,2,3)

#Choosing only numeric columns
index <- which(sapply(d1, is.numeric) == TRUE)
d1_mat <- as.matrix(d1[,index])

d1[,index] <- t(t(d1_mat)*v1)
d1
#  c1 c2 c3 c4
#1  1  8 21 rr
#2  2 10 24  t
#3  3 12 27  s
Run Code Online (Sandbox Code Playgroud)