这个问题在这里已经有了答案:
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/