Изменение значений в столбце фрейма данных, удовлетворяющих условию

#r

#r

Вопрос:

У меня возникли некоторые проблемы с R, и я был бы признателен вам за помощь. У меня есть фрейм данных с двумя переменными: YearsElapsed и YearsWithout. Первый имеет значения от -30 и от -21 до 12; второй от -12 до 129.

Мне нужно изменить значение YearsWithout на -30, когда yearswithout> 30 и соответствующие YearsElapsed=-30. (Это значение указывает, что наблюдение является частью моей контрольной группы.) Я пытался

 for (i in 1:5){
if(event_data$YearsElapsed[i]==-30 amp; event_data$YearsWithout[i]>=30 {
event_data$YearsWithout[i]==-30
  }
}
 

но это ничего не изменило.

Предположим, что event_data имеет в качестве столбцов YearsElapsed=c(-30,0,2,14,5) и YearsWithout=c(43,5,16,60,2), а также другие ковариаты. (К сожалению, я не смог загрузить данные.)

Ответ №1:

Используя case_when и мутировать из пакета dplyr:

 YearsElapsed=c(-30,0,2,14,5)
YearsWithout=c(43,5,16,60,2)
df=data.frame(YearsElapsed, YearsWithout)
library(dplyr)
df=mutate(df, YearsWithout=case_when(YearsElapsed==-30 amp; YearsWithout >= 30 ~ -30,
                                     TRUE ~ YearsWithout))
 

Вывод:

 > df
  YearsElapsed YearsWithout
1          -30          -30
2            0            5
3            2           16
4           14           60
5            5            2
 

Комментарии:

1. Спасибо за вашу помощь. Это решило мою проблему!

Ответ №2:

Вам не нужен for цикл для такого рода операций, найдите подмножество данных, которые вы хотите изменить, и замените значения.

 event_data$YearsWithout[event_data$YearsWithout >= 30 amp; event_data$YearsElapsed ==-30] <- -30
event_data

#  YearsElapsed YearsWithout
#1          -30          -30
#2            0            5
#3            2           16
#4           14           60
#5            5            2
 

данные

 event_data <- data.frame(YearsElapsed=c(-30,0,2,14,5), 
                         YearsWithout=c(43,5,16,60,2))
 

Комментарии:

1. Спасибо за вашу помощь. Это решило мою проблему!

Ответ №3:

Пожалуйста, попробуйте использовать =- вместо ==- . Вычисляет event_data$YearsWithout[i]==-30 условие, в то время event_data$YearsWithout[i]=-30 как присваивает значение.

 if(event_data$YearsElapsed[i]==-30 amp; event_data$YearsWithout[i]>=30 {
event_data$YearsWithout[i] <- -30
  }
}

 

Комментарии:

1. Хороший улов двойного знака равенства. 1

2. Я сам совершенно пропустил это мимо ушей. Спасибо!