【问题标题】:Sum selected columns and rows in R对 R 中的选定列和行求和
【发布时间】:2017-08-05 06:53:36
【问题描述】:

有人知道如何在特定条件下对选定列的行求和吗?

例如,我有五列,其行从 2000 年到 2008 年按年份排序。我只需要对“year

我想 group_by 不起作用,因为我不需要按组求和

我的数据是

A <- c(1,2,3,4,5,6,7,8,9,10)
B <- c(1,2,3,4,5,6,7,8,9,10)
Year <- c(2000, 2001, 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2008)

dta <- as.data.frame(A,B, Year)

我很想得到类似的东西

TotalColumn Year
 2          2000
 4          2001      
 6          2000
 8          2001
 10         2003
 12         2004
 14         2005
 NA         2006
 NA         2007
 NA         2008

【问题讨论】:

  • 如果您提供reproducible example 以明确您的输入是什么以及您想要的输出是什么,那么提供帮助会更容易。这样就可以测试可能的解决方案。
  • R 中一个理想的可重现示例涉及使用命令 your_table &lt;- data.frame(...) 创建示例数据框
  • dta &lt;- (A,B, Year) 不是正确的 R 代码,会报错。
  • 谢谢。现在它应该可以工作了

标签: r sum rows


【解决方案1】:

ifelse 在这里可能是一个不错的选择:

 A <- c(1,2,3,4,5,6,7,8,9,10)
 B <- c(1,2,3,4,5,6,7,8,9,10)
 Year <- c(2000, 2001, 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2008)

 dta <- as.data.frame(cbind(rep(NA, each = length(A)), Year))
 colnames(dta) <- c("TotalColumn", "Year")
 dta$TotalColumn <- ifelse(dta$Year < 2006, A + B, NA)

dta的输出

   TotalColumn Year
1            2 2000
2            4 2001
3            6 2000
4            8 2001
5           10 2003
6           12 2004
7           14 2005
8           NA 2006
9           NA 2007
10          NA 2008

【讨论】:

  • 非常感谢。但是,我只需要对那些 的行求和
  • 不幸的是,上面写着Warning message: In table(dta$TotalColumn) : data set ‘df$TotalColumn’ not found
  • 它被定义为dta,所以你需要调用dta$TotalColumntable(dta$TotalColumn) 没有给我基本 R 包(R 版本 3.3.2)的警告消息。
  • 它给了我 NAs
  • 如果你应用了上面的代码,table 中应该没有 NA。用str(dta)检查数据框的str,我得到:&gt; str(dta) 'data.frame': 10 obs. of 2 variables: $ TotalColumn: num 2 4 6 8 10 12 14 NA NA NA $ Year : num 2000 2001 2000 2001 2003 ...
【解决方案2】:

使用 data.table(根据 Frank 的评论更新)

library(data.table)
A <- c(1,2,3,4,5,6,7,8,9,10)
B <- c(1,2,3,4,5,6,7,8,9,10)
Year <- c(2000, 2001, 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2008)
dta <- data.table(A, B, Year)
dta[Year < 2006, TotalColumn := A+B][, .(TotalColumn, Year)]

或者您可以使用 Frank 的建议,通过将最后一行替换为

来编辑 dta
dta[Year < 2006, TotalColumn := A+B][, c("A", "B") := NULL]

结果:

    TotalColumn Year
 1:           2 2000
 2:           4 2001
 3:           6 2000
 4:           8 2001
 5:          10 2003
 6:          12 2004
 7:          14 2005
 8:          NA 2006
 9:          NA 2007
10:          NA 2008

【讨论】:

  • 仅供参考,data.table(A, B, Year) 将自动分配名称,就像 data.frame() 一样。此外,您可以删除 A 和 B 而不是过滤掉它们,例如 [, c("A","B") := NULL ]
  • 它说“检查 is.data.table(DT) == TRUE。否则,:= 和 :=(...) 被定义为在 j 中使用,仅一次,特别是方法。见帮助(“:=”)。你以前有过吗?
  • 我还必须将该新变量 TotalColumn 添加到现有数据框中。因此,我不能使用 data.table。
  • @Laura 在尝试此解决方案之前使用setDT(dta)。和“*我还必须将该新变量 TotalColumn 添加到现有数据框中。因此,我不能使用 data.table.*”
  • 对不起,我认为这与 data.table 有关。我尝试使用setDT(),但它没有给我 NA。
【解决方案3】:

尝试使用 purrr 中的 by_row 函数

A <- c(1,2,3,4,5,6,7,8,9,10)
B <- c(1,2,3,4,5,6,7,8,9,10)
Year <- c(2000, 2001, 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2008)
dta <- data.frame(A,B, Year)


Total_col <- dta %>% 
  filter(Year < 2006) %>% 
  select(A,B) %>% 
  purrr::by_row(sum, .collate = "cols", .to = "Total_Col") 

yr_total_Col <- dta %>% filter(Year < 2006) %>% select(Year)
Total_col <- cbind(Total_col,yr_total_Col)

这应该给你。

dta.x <- full_join(dta,Total_col) %>% select(Year,Total_Col)

#       Year Total_Col
#   1  2000         2
#   2  2001         4
#   3  2000         6
#   4  2001         8
#   5  2003        10
#   6  2004        12
#   7  2005        14
#   8  2006        NA
#   9  2007        NA
#   10 2008        NA

【讨论】:

  • 它说“替换有 21739 行,数据有 977”。在我的原始数据中,有 977 行。
  • 我认为您可能希望将年份列添加到 Total_col,以便在将所有内容重新合并在一起时可以拥有一个公共列。我使用了来自 dpylr 的 full_join。请参阅上面的修改。
  • 问题是我已经有一个包含所有列的数据框。我必须将该新列添加到现有数据集中。
  • 是的,如果您在两者中都有 ID 列,则将新列添加到现有数据集中会更容易。所以我的建议是将新列放在一个单独的数据框中,该数据框有两列(新列数据,年份标识符)。那么当你和已有的数据框合并的时候,join函数会沿着year列合并(两者应该是一样的)
  • 遗憾的是,这没有成功。还有其他方法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-22
相关资源
最近更新 更多