r - 按组逐列串联

标签 r string aggregation

这个问题在这里已经有了答案:





Cumulatively paste (concatenate) values grouped by another variable

(6 个回答)


5年前关闭。




假设我有这个输入:

             ID     date_1      date_2     str
1            1    2010-07-04  2008-01-20   A
2            2    2015-07-01  2011-08-31   C
3            3    2015-03-06  2013-01-18   D
4            4    2013-01-10  2011-08-30   D
5            5    2014-06-04  2011-09-18   B
6            5    2014-06-04  2011-09-18   B
7            6    2012-11-22  2011-09-28   C
8            7    2014-06-17  2013-08-04   A
10           7    2014-06-17  2013-08-04   B
11           7    2014-06-17  2013-08-04   B

我想逐步连接 str 的值列由组变量ID ,如以下输出所示:
             ID     date_1      date_2     str
1            1    2010-07-04  2008-01-20   A
2            2    2015-07-01  2011-08-31   C
3            3    2015-03-06  2013-01-18   D
4            4    2013-01-10  2011-08-30   D
5            5    2014-06-04  2011-09-18   B
6            5    2014-06-04  2011-09-18   B,B
7            6    2012-11-22  2011-09-28   C
8            7    2014-06-17  2013-08-04   A
10           7    2014-06-17  2013-08-04   A,B
11           7    2014-06-17  2013-08-04   A,B,B

我尝试使用 ave()使用此代码的功能:
within(table, {
  Emp_list <- ave(str, ID, FUN = function(x) paste(x, collapse = ","))
})

但它给出了以下输出,这不是我想要的:
         ID      date_1     date_2      str
1         1    2010-07-04 2008-01-20     A
2         2    2015-07-01 2011-08-31     C
3         3    2015-03-06 2013-01-18     D
4         4    2013-01-10 2011-08-30     D
5         5    2014-06-04 2011-09-18     B,B
6         5    2014-06-04 2011-09-18     B,B
7         6    2012-11-22 2011-09-28     C
8         7    2014-06-17 2013-08-04     A,B,B
10        7    2014-06-17 2013-08-04     A,B,B
11        7    2014-06-17 2013-08-04     A,B,B

当然我想避免循环,因为我在一个大型数据库上工作。

最佳答案

怎么样ave()Reduce() . Reduce()函数允许我们在计算结果时累积结果。所以如果我们用 paste() 运行它我们可以累积粘贴的字符串。

f <- function(x) {
    Reduce(function(...) paste(..., sep = ", "), x, accumulate = TRUE)
}

df$str <- with(df, ave(as.character(str), ID, FUN = f)

这给出了更新的数据框 df
   ID     date_1     date_2     str
1   1 2010-07-04 2008-01-20       A
2   2 2015-07-01 2011-08-31       C
3   3 2015-03-06 2013-01-18       D
4   4 2013-01-10 2011-08-30       D
5   5 2014-06-04 2011-09-18       B
6   5 2014-06-04 2011-09-18    B, B
7   6 2012-11-22 2011-09-28       C
8   7 2014-06-17 2013-08-04       A
10  7 2014-06-17 2013-08-04    A, B
11  7 2014-06-17 2013-08-04 A, B, B

注: function(...) paste(..., sep = ", ")也可以是 function(x, y) paste(x, y, sep = ", ") . (感谢皮埃尔·拉福图恩)

关于r - 按组逐列串联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34778422/

相关文章:

python - Python 中从逗号分隔的字符串中删除元素的有效方法

sql - 复杂分组 - 设计/性能问题

使用 plm() 和 vcovHC() 进行 Hausman-Taylor 估计器的稳健标准误差估计

r - 如何绘制 Voronoi 曲面分割的多边形而不是线段?

java - 用单反斜杠替换双反斜杠

c++ - 从 std::string 隐式转换为 eaSTL::string

sql - 具有两个连接的聚合 (MySQL)

Python Pandas 带条件聚合

json - 从 R 中的加载对象创建 json 字符串

r - 多个 data.table 列到一列向量