【问题标题】:Loop through DF, find values in one column that match list, add totals for each list value found and print遍历 DF,在与列表匹配的一列中查找值,为找到的每个列表值添加总计并打印
【发布时间】:2016-04-12 17:11:42
【问题描述】:
  1. 我有一个名为 df 的数据框,其中包含变量 AllCustomerName 和 sum.of.FY.Total 。第一列“AllCustomerName”包含所有客户的列表。我有一个单独的列表,其中包含我需要信息的客户的姓名。下面的代码旨在遍历数据框列 AllCustomerName,搜索与我的列表值相等的所有值,并分别为每个列表观察添加所有值。

    y <- list("client 1", "client 2", "client 3") for ( i in y){ if ( df$AllCustomerName == i ){ sum(df$Sum.of.FY.Total) } }

当我运行代码时,我会收到警告说“条件的长度 > 1,并且只会使用第一个元素”

谢谢

【问题讨论】:

  • 所以您正在尝试编写自己的merge 版本?也许你可以做一个可重复的例子? There are great tips here。模拟数据或与dput()共享。
  • 请考虑删除您的 rstudio 标签。 R 和 rstudio 是不同的软件,您的问题与 rstudio 无关。
  • 或者你可能想要aggregate(sum.of.FY.Total ~ AllCustomerName, FUN = sum, data = subset(df, AllCustomerName %in% y))
  • 为什么不只是子集 df where df$AllCustomerName %in% y 然后 group_by AllCustomerNamesummarise
  • @Imo 你是对的。不确定如何/为什么标记 rstudio。

标签: r dataframe


【解决方案1】:

这可以通过data.table完成

library(data.table)
setDT(df)[AllCustomerName %chin% unlist(y), .(Sum = sum(Sum.of.FY.Total)), 
                by = AllCustomerName]

【讨论】:

  • 效果很好。我没有考虑过使用这个包。谢谢!
  • 是的。几分钟前就这样做了。
  • 快速提问。如果这听起来微不足道,请原谅。保持相同的 data.table 语法,是否可以查找和汇总列表“y”中父项的所有部分匹配项。我能想到的唯一方法是使用 pmatch() 函数,该函数有效,但您的解决方案无效。
  • @Lyle 你能用一个可重复的例子发布一个新问题吗
  • 我刚刚做了link@akrun
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-13
  • 2021-08-12
  • 1970-01-01
相关资源
最近更新 更多