замена значения предыдущим значением строки на основе условия в R - PullRequest
3 голосов
/ 05 августа 2020

Я пытаюсь очистить некоторые данные, которые у меня есть.

Текущий формат имеет 4 переменных (id, динамик, текст и dup):

id speaker text dup 

1 GHS how are you 0 

2 yea yea 1 

3 CHA where is it 0 

4 CHA I cant find it 0 

5 CHA did you 0 

6 what what 1 

7 CHA did you find it 0

dup - это переменная i создан для пометки всех экземпляров, где динамик = текст. Когда это правда, я хочу заменить динамик значением строки над ним (см. Строки 2 и 6)

ЖЕЛАТЕЛЬНЫЙ ФОРМАТ:

id speaker text dup 

1 GHS how are you 0 

2 GHS yea 1 

3 CHA where is it 0 

4 CHA I cant find it 0
 
5 CHA did you 0 

6 CHA what 1 

7 CHA did you find it 0

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Возьмите индексы помеченных строк c(2,6), а затем заполните их предыдущей строкой c(2,6) - 1 == c(1,5). У вас уже есть столбец dup, но для ясности:

sel <- which(dat$speaker == dat$text)
dat$speaker[sel] <- dat$speaker[sel - 1]
1 голос
/ 05 августа 2020

Мы можем replace значений в 'динамике' до NA на основе 'dup', а затем fill с предыдущим значением, отличным от NA

library(dplyr)
library(tidyr)
df %>%
  mutate(speaker = replace(speaker, as.logical(dup), NA)) %>%  
  fill(speaker)
#  id speaker            text dup
#1  1     GHS     how are you   0
#2  2     GHS             yea   1
#3  3     CHA     where is it   0
#4  4     CHA  I cant find it   0
#5  5     CHA         did you   0
#6  6     CHA            what   1
#7  7     CHA did you find it   0

Или за один шаг с na.locf0 из zoo

library(zoo)
df$speaker <- with(df, na.locf0(replace(speaker, as.logical(dup), NA)))

Или, если есть только отдельные случаи,

with(df, ifelse(dup ==1, lag(speaker), speaker))

данные

df <- structure(list(id = 1:7, speaker = c("GHS", "yea", "CHA", "CHA", 
"CHA", "what", "CHA"), text = c("how are you", "yea", "where is it", 
"I cant find it", "did you", "what", "did you find it"), dup = c(0L, 
1L, 0L, 0L, 0L, 1L, 0L)), class = "data.frame", row.names = c(NA, 
-7L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...