按行ID折叠文本

时间:2017-09-11 01:17:43

标签: r function aggregate collapse

我有一个类似于这个主题的问题:“在数据框中按组折叠文本[复制]”

group text
a a1
a a2
a a3
b b1
b b2
c c1
c c2
c c3
c c4

我想通过两个顺序ID(不是整个ID组)来折叠

group text
a a1a2
a a2a3
b b1b2
c c1c2
c c2c3
c c3c4

4 个答案:

答案 0 :(得分:4)

替代tidyverse回答:

library(tidyverse)
dat %>%
  group_by(group) %>%
  mutate(text=paste0(lag(text),text)) %>% slice(-1)

使用data.table

library(data.table)
setDT(dat)
dat[, paste0(shift(text,1), text)[-1], by=group]

#   group   V1
#1:     a a1a2
#2:     a a2a3
#3:     b b1b2
#4:     c c1c2
#5:     c c2c3
#6:     c c3c4

答案 1 :(得分:2)

这个怎么样:

sudo python draw_net.py your_net.protobuf your_net.png

library(tidyverse)

df %>% 
  group_by(group) %>% 
  mutate(text = c(paste0(text[1:(n()-1)],text[2:n()]),NA)) %>% 
  filter(!is.na(text))
df %>% 
  group_by(group) %>% 
  summarise(text = list(paste0(text[1:(n()-1)],text[2:n()]))) %>% 
  unnest

上面的代码假设组长度始终大于1。如果存在单行组,则需要使用 group text 1 a a1a2 2 a a2a3 3 b b1b2 4 c c1c2 5 c c2c3 6 c c3c4 语句对其进行不同的处理。例如,如果我们添加一个group =“d”和text =“d1”的行,你可以这样做:

if
df %>% 
  group_by(group) %>% 
  summarise(text = if(n()==1) list(text) else list(paste0(text[1:(n()-1)],text[2:n()]))) %>% 
  unnest

答案 2 :(得分:1)

你可以尝试:

 unlist(by(df2$text,df2$group,function(x)paste0(head(x,-1),x[-1])))
    a1     a2      b     c1     c2     c3 
 "a1a2" "a2a3" "b1b2" "c1c2" "c2c3" "c3c4" 

答案 3 :(得分:0)

base Rsplit

的另一个stack选项
stack(lapply(split(df1$text, df1$group), function(x) paste0(x[-length(x)], x[-1])))[2:1]