【问题标题】:Advancing data frame calculations by integer通过整数推进数据帧计算
【发布时间】:2018-06-04 18:14:06
【问题描述】:

我正在尝试为一段数据编写一些更简洁/高效的代码。我有一个具有重复数据模式的数据框,请参阅下面的示例。

#Simple Sample Data
 Date_2012<-c(NA,NA,NA)
 X2<-c(1,1,1)
 X3<-c(2,2,2)
 XNA<-c(NA,NA,NA)
 Date_2013<-c(NA,NA,NA)
 X6<-c(3,3,3)
 X7<-c(4,4,4)
 df<-data.frame(Date_2012,X2,X3,XNA,Date_2013,X6,X7)

> df
  Date_2012 X2 X3 XNA Date_2013 X6 X7 XNA
1        NA  1  2  NA        NA  3  4 NA
2        NA  1  2  NA        NA  3  4 NA
3        NA  1  2  NA        NA  3  4 NA

我想用 X2 和 X3 进行一些计算,然后前进到 X6 和 X7 并进行相同的计算。这些用于计算的列总是彼此相距一个固定的数字,我想知道用什么来推进计算,无论是 for 循环还是其他什么。

#Calcuations, how to make this efficient? (loop?)
Calc<-df[,2]*df[,3]
Total2012<-sum(Calc)

Calc2<-df[,6]*df[,7]
Total2013<-sum(Calc2)

#Then continuously update the "Totals"     
Totals<-c(Total2012,Total2013)

# Desired Result
> Totals
[1]  6 36 #.......... with results being added until columns exhausted

总体而言,我想继续推进数据框(可能是整数?)并在更新总计列表的同时进行这些计算,我将如何有效地做到这一点?

我想用一个函数来控制df[A]*df[b],但是列太多了,不能简洁,因为我必须多次调用该函数。

我错过了更好的方法吗?

感谢您的帮助。

【问题讨论】:

  • XNA 列是什么?
  • @userR 只是为了帮助将列分开一点,我的数据中有空白列,但对这个问题并不重要。
  • 那么在每个X1X2 列之后会有XNA 列吗?
  • 是的,格式是Date,Data1,Data2,NA,Date,Data3,Data4,NA,Date,.......等等。 @user

标签: r for-loop


【解决方案1】:

我们可以使用sapply 来做这样的事情:

Totals = sapply((1:ncol(df))[c(FALSE, TRUE, FALSE, FALSE)], 
                function(x) sum(df[,x]*df[,x+1]))

# [1]  6 36

这会创建一个列索引序列,将其输入sapply 以计算连续列乘积的列总和。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多