首页 文章

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

提问于
浏览
2

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

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 回答

  • 1

    我们可以通过 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))
    
  • 1

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

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

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

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

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

  • 2

    矫枉过正的解决方案

    library(dplyr)
    
    df1 %>%
      mutate_all(.,function(col){C$C*col})
    
  • 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)
    

相关问题