Проверка условий и присвоение значений по строкам в R

#r

#r

Вопрос:

У меня есть набор данных, в котором есть одна строка для каждого субъекта, и есть переменная, для которой я хочу переназначить значения на основе условия. Например, если значение переменной равно 6, я хочу изменить значение на среднее значение других переменных в наборе данных.

 Subject V1 V2 V3 V4
123     2  2  2  3
234     1  5  4  4
345     1  4  3  6
  

В приведенном выше наборе данных для каждого пациента я хочу переназначить все 6 для V4 со средним значением V1, V2, V3 этого пациента. Таким образом, для объекта 345 версия 4 примет новое значение 8/3 or ((1 4 3)/3) . Я думал об использовании ifelse инструкции, но мне не удалось заставить ее работать. Любая помощь была бы высоко оценена.

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

1. Вы хотите заменить значение 6 только в V4 или во всех столбцах?

2. Только для V4 . Я изучаю решения, опубликованные прямо сейчас. 🙂

Ответ №1:

Учитывая:

 library(dplyr)
library(tibble)

data <- tibble(
  Subject = c("123", "234", "345"),
  V1 = c(2, 1, 1),
  V2 = c(2, 5, 4),
  V3 = c(2, 4, 3),
  V4 = c(3, 4, 6)
)
  

Вы могли бы сделать это с помощью base-R:

 data$V4 <- ifelse(data$V4 == 6,(data$V1   data$V2   data$V3)/3, data$V4)
  

Или с использованием цепочки dplyr:

 data <- data %>%
  mutate(V4 = ifelse(V4 == 6,(V1   V2   V3)/3, V4))
  

Ответ №2:

Измените V4 значение на NA и замените их на rowMeans .

 df$V4[df$V4 == 6] <- NA
df$V4 <- ifelse(is.na(df$V4), rowMeans(df[-1], na.rm = TRUE), df$V4)
df

#  Subject V1 V2 V3   V4
#1     123  2  2  2 3.00
#2     234  1  5  4 4.00
#3     345  1  4  3 2.67
  

Ответ №3:

Вы можете использовать любую из приведенных ниже формул.

 d[,4]<-ifelse(d[,4]==6,(d[,1] d[,2] d[,3])/3,d[,4])

d[,4]<-ifelse(d[,4]==6,rowMeans(d[,1:3]),d[,4])