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

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

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)

2 years ago

我们可以通过 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 years ago

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

问题是你试图在列列表上执行乘法( * )函数,这就是数据框的作用 . 对于从第二个数据框(C)乘以单个列(C),您可以将该单个列称为 C$C C["C"]C[,1]C[1] . 如果您使用了 df1[,1]*C[,1] 或其他一种引用df1第一列的方法,那么它可以正常工作 . 但挑战是你想要做所有的专栏 .

因此,您需要使用策略将乘法函数应用于列列表 . 除此之外,还有更多的方法可以做到这一点 . 例如:

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

2 years ago

另一个解决方案是 sweep(df1, 1, C$C,*) ,这意味着"sweep out"通过乘法从 df1 的每一列 C$C 表示的统计量 .

2 years ago

矫枉过正的解决方案

library(dplyr)

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

2 years ago

也试试

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)