#r #dataframe
#r #фрейм данных
Вопрос:
У меня есть следующий фрейм данных, который я хотел бы уменьшить
id t1 t2 t3 t4 t5 t6 t7 t6 t8 t9
1 s s s w r r t t w s
2 s s s o o w t t o s
3 s s s o w w t t o s
4 s s s o o w t t o s
5 s s s s s s w w s s
6 s s s w t t w w w s
метки обозначаются следующими буквами: «o», «s», «h», «e», «r», «sp», «ho», «TV», «tr», «trp» и «w»
На основе идентификатора я хотел бы идентифицировать буквы, которые встречались до и после w .
Вывод:
1 s w r t w s
2 s o w t o s
3 s o w t o s
4 s o w t o s
5 s w s
6 s w t w s
Образец данных:
df<-structure(list(id=c(1,2,3,4,5,6), t1=c("s","s","s","s","s","s"), t2=c("s","s","s","s","s","s"),t3 = c("s","s","s","s","s","s"),
t4 = c("w","o","o","o","s","w"), t5 = c("r","o","w","o","s","t"), t6 = c("r","w","w","w","s","t"),
t7 = c("t","t","t","t","w","w"),t6 = c("t","t","t","t","w","w"), t8 = c("w","o","o","o","s","w"), t9=c("s","s","s","s","s","s")), row.names = c(NA,
6L), class = "data.frame")
Ответ №1:
Мы могли бы использовать rle
lst1 <- apply(df[-1], 1, function(x) rle(x)$values)
do.call(rbind, lapply(lst1, `length<-`, max(lengths(lst1))))
# t3 t4 t6 t6.1 t8 t9
#1 "s" "w" "r" "t" "w" "s"
#2 "s" "o" "w" "t" "o" "s"
#3 "s" "o" "w" "t" "o" "s"
#4 "s" "o" "w" "t" "o" "s"
#5 "s" "w" "s" NA NA NA
#6 "s" "w" "t" "w" "s" NA
Или если мы знаем максимальную длину до,
t(apply(df[-1], 1, function(x) `length<-`(rle(x)$values, 6)))
Или с tidyverse
library(dplyr)
library(tidyr)
library(stringr)
df %>%
pivot_longer(cols = -id) %>%
group_by(id) %>%
summarise(value = rle(value)$values) %>%
mutate(colnm = str_c('V', rowid(id))) %>%
pivot_wider(names_from = colnm, values_from = value)
Ответ №2:
Вы могли бы сделать:
read.table(text = gsub("(.)( \1) ","\1",do.call(paste, df[-1])), fill = TRUE)
V1 V2 V3 V4 V5 V6
1 s w r t w s
2 s o w t o s
3 s o w t o s
4 s o w t o s
5 s w s
6 s w t w s