R 将文本折叠2个ID';这是一排

R 将文本折叠2个ID';这是一排,r,function,aggregate,collapse,R,Function,Aggregate,Collapse,我有一个类似于此主题的问题:“在数据帧中按组折叠文本[复制]” 我想按两个连续ID折叠(不是整个ID组) 这个怎么样: library(tidyverse) df %>% group_by(group) %>% mutate(text = c(paste0(text[1:(n()-1)],text[2:n()]),NA)) %>% filter(!is.na(text)) 或 上面的代码假定组长度始终大于1。如果有单行组,则需要一个If语句来区别对待它们。

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

我想按两个连续ID折叠(不是整个ID组)

这个怎么样:

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”,则可以执行以下操作:

df %>% 
  group_by(group) %>% 
  summarise(text = if(n()==1) list(text) else list(paste0(text[1:(n()-1)],text[2:n()]))) %>% 
  unnest
组文本
1 a a1a2
2 a a2a3
3 b b1b2
4 c c1c2
5 c c2c3
6 c c3c4
7 d d1
这个怎么样:

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”,则可以执行以下操作:

df %>% 
  group_by(group) %>% 
  summarise(text = if(n()==1) list(text) else list(paste0(text[1:(n()-1)],text[2:n()]))) %>% 
  unnest
组文本
1 a a1a2
2 a a2a3
3 b b1b2
4 c c1c2
5 c c2c3
6 c c3c4
7 d d1
您可以尝试:

 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" 
您可以尝试:

 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" 

备选
tidyverse
答案:

library(tidyverse)
dat %>%
  group_by(group) %>%
  mutate(text=paste0(lag(text),text)) %>% slice(-1)
使用
数据。表

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

备选
tidyverse
答案:

library(tidyverse)
dat %>%
  group_by(group) %>%
  mutate(text=paste0(lag(text),text)) %>% slice(-1)
使用
数据。表

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

另一个
base R
选项,带有
split
stack

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

另一个
base R
选项,带有
split
stack

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

变异-
dat%>%group\u by(group)%%>%mutate(text=paste0(lag(text),text))%%>%filter(row\u number()!=1)
我喜欢它。更简洁。你应该加上它作为答案。另外,对于最后一行,您可以执行
slice(2:n())
。谢谢。我收到了这两个方面的错误消息。第一个例子是:filter_impl(.data,quo)中的错误:Column``不可访问。在第二个选项中,我得到了:错误:意外的“=”in:“groupby(group)%%>%summary(text=”我将尝试使用LateMail的变体非常感谢你们。我删除的数据框中有一个问题。我已使用LateMail的变体使其工作。变体-
dat%%>%groupby(group)%%>%mutate(text=0(lag(text),text))%>%filter(row_number()!=1)
我喜欢它。更简洁。你应该把它作为答案添加进去。另外,对于最后一行,你可以做
slice(2:n())
。谢谢。这两个选项都有错误消息。第一个选项是:filter_impl(.data,quo):列``不可访问。使用第二个选项,我得到:错误:意外的“=”出现在:“group_by(group)%%>%Summary(text=”我将尝试使用LateMail的变体非常感谢你们两位。我删除的数据框中有一个问题。我已使用LateMail的变体进行了工作。如果组中只有一行,您希望执行什么操作?如果组中只有一行,您希望执行什么操作?