将数据框中的所有列乘以一列

时间:2018-12-10 12:27:25

标签: r

我知道这是一个基本问题,但找不到任何解决方案。 我想将数据框的所有列乘以单列。

df1<-data.frame(F1=c(1,5,8,9),F2=c(1,5,8,9),F3=c(1,5,8,9))
> df1
  F1 F2 F3
1  1  1  1
2  5  5  5
3  8  8  8
4  9  9  9

C<-data.frame(C=c(2,1,2,0.5))
> C
    C
1 2.0
2 1.0
3 2.0
4 0.5

我想将df1的每一列乘以C。 我尝试过:

df2<-df1[,c(1:3)]*C[,1]
df2<-df1*C
df2< df1%*%C
and
for(i in 2:length(names(b))) {
+     df2 <- C[, 1] * b[, i]
+ }

谢谢!

5 个答案:

答案 0 :(得分:5)

也尝试

df1 * t(C)
#    F1   F2   F3
#1  2.0  2.0  2.0
#2  5.0  5.0  5.0
#3 16.0 16.0 16.0
#4  4.5  4.5  4.5

当我们尝试乘以数据帧时,它们的大小必须相同。

df1 * C
  Ops.data.frame(df1,C)中的

错误:     “ *”仅适用于大小相等的数据帧

t()C转换成矩阵,即维属性的长度为4的向量。当我们将其与df1相乘时,该向量将被回收。

也可以以相同的方式工作(并且可能比移置C更快):

df1 * C$C

df1 * unlist(C)

答案 1 :(得分:3)

我们可以rep将“ C”列相乘来向量化乘法

df1 * C[row(df1)]
#     F1   F2   F3
#1  2.0  2.0  2.0
#2  5.0  5.0  5.0
#3 16.0 16.0 16.0
#4  4.5  4.5  4.5

或明确使用rep

df1 * rep(C$C, ncol(df1))

答案 2 :(得分:2)

过分的dplyr解决方案

library(dplyr)

df1 %>%
  mutate_all(.,function(col){C$C*col})

答案 3 :(得分:1)

这里只有很多好的代码答案,所以我想我要解释出什么问题了。

问题是您要对列列表执行乘(*)函数,这就是数据帧。为了从第二个数据帧(C)中乘以单列(C),您将把该单列称为C$C C["C"]C[,1]C[1]。如果您使用df1[,1]*C[,1]或其他方法来引用df1的第一列,则可以正常工作。但是挑战在于您想完成所有列。

因此,您需要使用一种策略来将乘法功能应用于列列表。有更多的方法可以做到这一点。例如:

 as.data.frame(lapply(df1, `*`, C$C))

答案 4 :(得分:1)

另一种解决方案是sweep(df1, 1, C$C, `*`),这意味着通过乘法从C$C的每一列中“清除”由df1表示的统计信息。