Как я могу переключать значения между столбцами для определенных строк? - PullRequest
0 голосов
/ 21 мая 2019

Я строил свой набор данных для какой-то бухгалтерской работы и случайно допустил ошибку. Я хотел бы переключить каждый экземпляр кредита (столбец journalItemLine_creditAmount) на счете 3605 на дебет (столбец journalItemLine_debitAmount), а каждый экземпляр дебета - на кредит.

data<-read.csv(file.choose(),head=TRUE)  
fixed_data<-if(data$journalItemLine_account="3605"){journalItemLine_debitAmount==journalItemLine_creditAmount}
fixed_data<-if(data$journalItemLine_account="3605"){journalItemLine_creditAmount==journalItemLine_debitAmount}

Вот ошибка, которую я получаю. Error: unexpected '=' in " fixed_data<-if(data$journalItemLine_account="

Ответы [ 3 ]

0 голосов
/ 21 мая 2019

Попробуйте следующее.Для получения интересующих его значений используется логический индекс.

inx <- data$journalItemLine_account == "3605"

tmp <- data$journalItemLine_debitAmount[inx]
data$journalItemLine_debitAmount[inx] <- data$journalItemLine_creditAmount[inx]
data$journalItemLine_creditAmount[inx] <- tmp

Окончательная очистка.

rm(inx, tmp)
0 голосов
/ 21 мая 2019

Мне понадобятся данные примера для проверки, но transform тоже должно работать:

new_data <- transform(fixed_data, 
                      journalItemLine_debitAmount = ifelse(data$journalItemLine_account=="3605", journalItemLine_creditAmount, journalItemLine_debitAmount),
                      journalItemLine_creditAmount = ifelse(data$journalItemLine_account=="3605", journalItemLine_debitAmount, journalItemLine_creditAmount))
0 голосов
/ 21 мая 2019

Отбрасывая комментарии @ qdread, у вас есть несколько проблем:

  1. if (a=1) ... не удается, потому что вы присваиваете , когда вы должны проверять равенство.Вместо этого используйте if (a==1) ....

  2. if требует, чтобы его условное выражение было точно длиной 1, но это будет иметь место только в том случае, если ваш кадр имеет 1 строку;0 или больше 2 выдаст вам предупреждение: "условие имеет длину> 1, и будет использоваться только первый элемент" .Вместо этого используйте ifelse(condition, then, else).

  3. Ваше переназначение должно, вероятно, войти в столбец кадра.Ваш fixed_data является вектором (что хорошо), но впоследствии его нет в кадре.В действительности, ifelse, рекомендованный в # 2 выше, не знает и не заботится о фреймах, он просто работает с векторами, поэтому аргументы "conditional", "then" (если true) и "else" (если false)все должны быть векторами одинаковой длины (или длиной 1, переработанными).

Ваш код должен выглядеть примерно так (не проверено):

data <- read.csv(file.choose(), head = TRUE)
newcred <- ifelse(data$journalItemLine_account == "3605",
                  data$journalItemLine_debitAmount, data$journalItemLine_creditAmount)
newdebt <- ifelse(data$journalItemLine_account == "3605",
                  data$journalItemLine_creditAmount, data$journalItemLine_debitAmount)
data$journalItemLine_creditAmount <- newcred
data$journalItemLine_debitAmount  <- newdebt

(Опять же, не проверено! , пожалуйста, проверьте изменения, прежде чем использовать это для всех данных.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...