0

我有一个数据框对象,它有 24 列,每一列都有不同的长度。我想将每一列乘以 24 个值的向量。我正在考虑使用 apply 函数,因为我没有任何矩阵。我的猜测是:

trans_temp:
                    Ta.f Ta.f Ta.f Ta.f
1995-10-13 04:00:00 13.6 13.6 13.6 13.6
1995-10-13 05:00:00 13.6 13.6 13.6 13.6
1995-10-13 06:00:00 13.6 13.6 13.6 13.6
1995-10-13 07:00:00 13.5 13.5 13.5 13.5
1995-10-13 08:00:00 13.5 13.5 13.5 13.5

我的向量是

    x <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24)

所以我想要第一列乘以 1,第二列乘以 2,第三列乘以 3,依此类推。我不能直接相乘,因为它是一个 data.frame 对象。

应用(trans_temp,x,MARGIN=2,有趣)

有什么帮助吗?

4

3 回答 3

3

您可以直接创建一个矩阵,然后将数据与它相乘:

as.matrix(trans_temp) * col(trans_temp)

与 eddi's 进行基准测试

m <- as.data.frame(matrix(runif(1e7), ncol=1000))
x <- seq_len(1000)
system.time(tt1 <- as.matrix(m) * col(m)) # 0.335 seconds
system.time(tt2 <- t(x*t(m))) # 0.505 seconds
identical(tt1, tt2) # TRUE
于 2013-04-24T15:07:17.947 回答
2

这是另一种不使用的方法apply,它依赖于 R 回收行为:

t(x*t(trans_temp))

这可能会比其他两种方法快得多。

^^^ 在 Arun 的编辑之后不再存在 :) 现在的情况是你可以有一个任意的x(如果你想要一个任意的操作除了任意的x,那么你会选择西蒙的答案)。

于 2013-04-24T15:18:07.787 回答
2

你在正确的轨道上,但我不明白你的列有不同的长度,除非你的意思是一些包含,例如它们中的 NA。用于MARGIN = 1跨行应用。

x <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24)
t( apply(trans_temp , MARGIN = 1 , function(y) x * y ) )

你甚至可以像这样缩短通话时间:

 t( apply(trans_temp , 1 , `*` , x ) )
于 2013-04-24T15:06:13.630 回答