将()函数应用于数据框

时间:2013-04-24 15:02:15

标签: r

我有一个数据框对象,它有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,有趣)

任何帮助?

3 个答案:

答案 0 :(得分:3)

您可以直接创建矩阵,只需将数据与其相乘:

as.matrix(trans_temp) * col(trans_temp)

使用eddi的

进行基准测试
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

答案 1 :(得分: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 ) )

答案 2 :(得分:2)

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

t(x*t(trans_temp))

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

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