【问题标题】:How to sum up the nth column with the n+1th column in a dataframe如何将第 n 列与数据框中的第 n + 1 列相加
【发布时间】:2015-02-25 13:45:46
【问题描述】:

如何将数据框中的第 n 列与列子集的数据框中的第 n-1 列相加?

例如我有一个如下的数据框:

ID          C1  C2  C3 
1   2000-12-24  3d  2d
2   2000-12-24  2d  1d

我希望 R 执行以下操作:

ID C1         C2                        C3           
1  2000-12-24 2000-12-24+3d=2000-12-27  2000-12-27+2d=2000-12-29
2  2000-12-24 2000-12-24+2d=2000-12-26  2000-12-26+1d=2000-12-27

所以最终的数据框看起来像这样:

ID  C1          C2          C3          ...
1   2000-12-24  2000-12-27  2000-12-29
2   2000-12-24  2000-12-26  2000-12-27

更新:

数据已相应生成:

library(plyr)
library(lubridate)
library(reshape2)
Heterotransaction <- rgamma(2,shape=3 , scale=1)
ID <- list(1:2) 
Elog <- data.frame(ID,Heterotransaction)
Elog$fist_transaction <- "2000-12-24"
Elog$fist_transaction <- as.Date(Elog$fist_transaction, "%Y-%m-%d")
Heterotransaction <- rgamma(2,shape=3 , scale=1) 

f.transaction <- function(x){
  y<- (rexp(2,x))
duration(y, units = "years")
}

tbtrans<-ldply(Heterotransaction, f.transaction) 
purchases<-data.frame(ID,tbtrans) 
Elognew<- merge.data.frame(Elog, purchases)

【问题讨论】:

  • 您的原始数据集中是否有3d 2d 等或只是3 2
  • 由于我不习惯 R 我不知道如何解释它们是什么格式,但希望上面的更新代码能给你所需的信息。
  • 请检查更新。正如您在第二组示例中展示的那样,我得到了预期的输出。

标签: r function dataframe sum multiple-columns


【解决方案1】:

你可以试试

 df1[3:ncol(df1)] <- lapply(3:ncol(df1), function(i) rowSums(df1[2:i])) 
 df1
 #  ID C1 C2 C3
 #1  1  2  5  7
 #2  2  4  7  8

 df1[-1] <- t(apply(df1[-1], 1, cumsum))

或者另一种选择是使用Reduce

 library(data.table)
 setDT(df1)[,2:ncol(df1) := Reduce(`+`, .SD, accumulate=TRUE),
                       .SDcols=2:ncol(df1)][]
 #   ID C1 C2 C3
 #1:  1  2  5  7
 #2:  2  4  7  8

更新

基于新数据集,一个选项是修改第一个解决方案

 df2[3:ncol(df2)] <- do.call(rbind, lapply(3:ncol(df2), function(i) 
     as.Date(df2[,2]+cumsum(as.numeric(sub('[^0-9]+', '', df2[,i]))))))
 df2[3:ncol(df2)] <- lapply(df2[3:ncol(df2)], as.Date, origin='1970-01-01')

 df2
 # ID         C1         C2         C3
 #1  1 2000-12-24 2000-12-27 2000-12-29
 #2  2 2000-12-24 2000-12-26 2000-12-27

数据

df1 <- structure(list(ID = 1:2, C1 = c(2L, 4L), C2 = c(3L, 3L), 
C3 = c(2L, 1L)), .Names = c("ID", "C1", "C2", "C3"),
 class = "data.frame", row.names = c(NA, -2L))

df2 <- df2 <- structure(list(ID = 1:2, C1 = structure(c(11315, 11315),
class = "Date"), 
C2 = c("3d", "2d"), C3 = c("2d", "1d")), .Names = c("ID", 
"C1", "C2", "C3"), row.names = c(NA, -2L), class = "data.frame")

【讨论】:

  • 非常感谢您的有用评论!但我仍然无法解决我的问题,因为在我的特定情况下我没有数值。在 C1 中,我有一个像 2000-12-24 这样的日期,然后在以下列 C1、C2... 天.. 最后我想在每一列中只给出日期.. C1= 2000-12-24 , C2=2000-12-24+2d=2000-12-26 和 C3=2000-12-26+5=2000-12-31.. 抱歉不够具体!!
  • @dschn 我的代码基于您的输入数据集和预期的数据集。如果您有不同类型的数据,为什么不发布基于它的示例和预期代码。
  • @dschn 请更新您的帖子。我认为可以将列转换为Date类然后添加
  • 对不起,我不想让它太复杂,所以我之前做了这个更简单的例子。
  • @dschn 是的,那么没人知道你的列的原始类是什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多