Я пытаюсь выполнить замену (перекодирование) значений строка за строкой (циклически повторяя строки) на основе одного или нескольких столбцов в этих строках. Я рассмотрел множество предыдущих примеров здесь и в других местах (справка R), но не смог продвинуться очень далеко.
Вот пример набора данных:
> set.seed(1234)
> let<-c("AB","AA","BB")
> df <- data.frame(rbind(x1=c(12,"DF1",sample(let,6,TRUE)),x2=c(12,"HA.1",sample(let,6,TRUE)),x3=c(21,"DF1",sample(let,6,TRUE)),x4=c(12,"AS.2",sample(let,6,TRUE))
+ ))
> df
X1 X2 X3 X4 X5 X6 X7 X8
x1 12 DF1 AB AA AA AA BB AA
x2 12 HA.1 AB AB AA AA BB AA
x3 21 DF1 AB BB AB BB AB AB
x4 12 AS.2 AB AB AB AB AB AB
Я хотел бы условно изменить значения кодирования (замены) в столбцах 3: 8 (с X3 по X8), основываясь на значениях в X1 и X2, используя if / then. «AB» становится 1, если X1 = 12, и X2 = DF1, «AA» становится 2, если X1 = 12, и X2 = DF1, «BB» становится 3, если X1 = 12, и X2 = DF1 et c. Будет много других (вложенных?) Операторов if, которые нужно добавить для завершения этого конкретного случая c, но я не уверен, как подойти даже к самому основному c аспекту этого сценария: как подготовить замену значений в столбцах 3: 8 на основе значения столбца 1 (а также столбца 2 или более столбцов) в данной строке.
Итак, просматривая каждую строку, я бы проверил, если значение в X2 = DF1 и X1 = 12 (например), и если это так, в обоих случаях измените значения AB на 1, AA на 2 и BB на 3 ...
for(i in 1:nrow(df)){
if((df$X2[i]=="DF1") & (df$X1[i]=12)) {
ifelse(df[i,3:8] == "AB", 1, ifelse(df[i,3:8]=="AA", 2,ifelse(df[i,3:8]=="BB",3,"NA")))}
else{}
}
Теперь ... это, похоже, ничего не делает - без изменений df
и без предупреждений. Но операторы ifelse
работают, когда я задаю строку (4):
> ifelse(df[4,3:8] == "AB", 1, ifelse(df[4,3:8]=="AA", 2,ifelse(df[4,3:8]=="BB",3,"NA")))
X3 X4 X5 X6 X7 X8
x4 "1" "3" "1" "1" "1" "2"
> df[4,3:8]
X3 X4 X5 X6 X7 X8
x4 AB BB AB AB AB AA
Значит, в начальном if &
должно быть что-то? Нужно ли что-то включать в мое предложение else
?
И, конечно, мой «реальный» случай использования более сложен, поскольку для каждого отдельного значения в X1 или X2 требуются разные операторы if / then для перекодирования значений в столбце 3: 8
В любом случае - я даже правильно подхожу к этому? Будет ли справочная таблица работать лучше? Я бы настроил дополнительные вложенные операторы if / & для каждой комбинации значений для X1 и X2. Это будет ужасно, но если я смогу заставить вложенные операторы if работать, то, по крайней мере, я смогу туда добраться.
Спасибо за любые предложения!