Вот метод base R
с aggregate
.Создайте столбец группировки, сравнив равенство соседних элементов равным 'X', используйте его в aggregate
для группировки и paste
элементов вместе.
aggregate(Y ~ X + grp, transform(dat,
grp = cumsum(c(TRUE, X[-1] != X[-length(X)]))),
FUN = paste, collapse= ",")[c('X', 'Y')]
# X Y
#1 cat Q
#2 dog U
#3 cat T
#4 dog P
#5 cat Y,K
#6 dog P
data
dat <- structure(list(X = c("cat", "dog", "cat", "dog", "cat", "cat",
"dog"), Y = c("Q", "U", "T", "P", "Y", "K", "P")),
class = "data.frame", row.names = c(NA, -7L))
Или используя python
dat['grp'] = (dat.X != dat.X.shift()).cumsum()
out = dat.groupby(['grp', 'X'])['Y'].apply(lambda x: \
",".join(x)).reset_index()[['X', 'Y']]
print(out)
# X Y
#0 cat Q
#1 dog U
#2 cat T
#3 dog P
#4 cat Y,K
#5 dog P
data
import pandas as pd
import numpy as np
dat = pd.DataFrame({'X': ["cat", "dog", "cat", "dog", "cat", "cat",
"dog"], "Y": ["Q", "U", "T", "P", "Y", "K", "P"]})