Concatenate Rows In A Dataframe
I have a dataframe structured like below: Column A Column B 1 A 1 B 1 C 1 D 2 B 2 C 2 D 2 E
Solution 1:
In R
, we can use dplyr
. After grouping by 'ColumnA', paste
the contents of 'ColumnB' and create a new column with mutate
library(dplyr)
df1 %>%
group_by(ColumnA) %>%
mutate(ColumnC = paste(ColumnB, collapse=""))
# A tibble: 8 x 3# Groups: ColumnA [2]# ColumnA ColumnB ColumnC# <int> <chr> <chr>#1 1 A ABCD#2 1 B ABCD#3 1 C ABCD#4 1 D ABCD#5 2 B BCDE#6 2 C BCDE#7 2 D BCDE#8 2 E BCDE
Or another option is data.table
library(data.table)
setDT(df1)[, ColumnC := paste(ColumnB, collapse=""), by = ColumnA]
data
df1 <- structure(list(ColumnA = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), ColumnB = c("A",
"B", "C", "D", "B", "C", "D", "E")), .Names = c("ColumnA", "ColumnB"
), class = "data.frame", row.names = c(NA, -8L))
If we need python
, then
>>> import pandas as pd;
>>> df1 = pd.read_clipboard()
>>> df1
# ColumnA ColumnB#1 1 A#2 1 B#3 1 C#4 1 D#5 2 B#6 2 C#7 2 D#8 2 E>>> df1['ColumnC'] = df1.groupby('ColumnA')['ColumnB'].transform(lambda x: ''.join(x))
>>> df1
# ColumnA ColumnB ColumnC#1 1 A ABCD#2 1 B ABCD#3 1 C ABCD#4 1 D ABCD#5 2 B BCDE#6 2 C BCDE#7 2 D BCDE#8 2 E BCDE
Solution 2:
A one-liner in base R
as suggested by @Sotos in the comment. Make sure that ColumnB
of df
is a character
and not a factor
for this solution.
with(df, ave(ColumnB, ColumnA, FUN = function(i) paste(i, collapse = '')))
Another base R
solution:
df$ColumnC<-rep(unlist(by(df,INDICES = df$ColumnA,
function(t){paste(t$ColumnB,collapse = "")},simplify = F)),each=4)
>df#ColumnA ColumnB ColumnC#1 1 a abcd#2 1 b abcd#3 1 c abcd#4 1 d abcd#5 2 b bcde#6 2 c bcde#7 2 d bcde#8 2 e bcde
Post a Comment for "Concatenate Rows In A Dataframe"