#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])