R语言 在一行中按2个ID折叠文本

bqf10yzr  于 2022-12-06  发布在  其他
关注(0)|答案(4)|浏览(148)

我有一个与此主题类似的问题:“依群组折迭数据框中的文字[重复]”

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
dy2hfwbg

dy2hfwbg1#

备选答案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
7uzetpgm

7uzetpgm2#

不如这样吧:

library(tidyverse)

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


第一次
上面的代码假定组长度总是大于1。如果有单行组,则需要使用if语句来区别对待。例如,如果我们添加一行,其中group=“d”,text=“d1”,则可以执行以下操作:
第一个

2g32fytz

2g32fytz3#

您可以尝试:

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"
brvekthn

brvekthn4#

splitstack的另一个base R选项

stack(lapply(split(df1$text, df1$group), function(x) paste0(x[-length(x)], x[-1])))[2:1]

相关问题