我有一个数据框对象,它有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,有趣)
任何帮助?
答案 0 :(得分:3)
您可以直接创建矩阵,只需将数据与其相乘:
as.matrix(trans_temp) * col(trans_temp)
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
,然后你会选择西蒙的答案。)