我知道这是一个基本的问题,但无法找到任何解决方案 . 我想将数据帧的所有列乘以单列 .
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 回答
我们可以通过
rep
对'C'列进行乘法矢量化或者明确使用
rep
这里有很多好的代码只有答案,所以我想我会解释出了什么问题 .
问题是你试图在列列表上执行乘法(
*
)函数,这就是数据框的作用 . 对于从第二个数据框(C)乘以单个列(C),您可以将该单个列称为C$C
C["C"]
,C[,1]
或C[1]
. 如果您使用了df1[,1]*C[,1]
或其他一种引用df1第一列的方法,那么它可以正常工作 . 但挑战是你想要做所有的专栏 .因此,您需要使用策略将乘法函数应用于列列表 . 除此之外,还有更多的方法可以做到这一点 . 例如:
另一个解决方案是
sweep(df1, 1, C$C,
*)
,这意味着"sweep out"通过乘法从df1
的每一列C$C
表示的统计量 .矫枉过正的解决方案
也试试
当我们尝试乘以数据帧时,它们必须具有相同的大小 .
t()
将C
转换为矩阵,即维度属性为长度为4的向量 . 当我们将它与df1
相乘时,该向量将被回收 .什么也可以以相同的方式工作(并且可能比转置
C
更快):要么