我知道这是一个基本问题,但找不到任何解决方案。 我想将数据框的所有列乘以单列。
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]
+ }
谢谢!
答案 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
表示的统计信息。