Я новичок в R и был бы признателен за вашу помощь со следующим вопросом:
У меня есть код, который проходит через все значения (x) в столбце набора данных с именем m, сравнивая их одно за другим с фиксированным значением с помощью цикла for. Я бы хотел, чтобы x сравнивался с моим фиксированным значением (0,17) ТОЛЬКО ЕСЛИ ячейка в m [(ТАКЖЕ СТРОКА, КАК x), "reference_column_name"] содержит определенную строку.
Цель состоит в том, чтобы получить в конце m столбец со значениями 0,1,2 или 3 на основе сравнения x с ячейкой из ссылочного столбца с тем же номером строки, что и x. Что-то вроде этого:
new_column
0
2
2
3
1
1
2
0
3
Как мне сослаться на строку x (поскольку моя переменная изменяется по мере продолжения цикла for)? Чем я могу заменить "(ЖЕ СТРОКА, КАК x)"?
это мой код:
m$new_colum <- 0 #I start by assigning everything the value 0.
for (x in m$current_column) {
if ((grepl("string",((m[(SAME ROW AS x),"reference_column_name"])),fixed=TRUE))==TRUE){
if (is.na(x)){
m$new_column<-0
}
else if (x <= 0.17) {
m$new_column<-1}
else if (x > 0.17) {
m$new_column<-2}
}
else {m$new_column<-3}
}
Я изменил все имена переменных и столбцов, чтобы облегчить чтение этого вопроса - я знаю, что имена должны быть короче.
Спасибо за вашу помощь!





В соответствии с моим пониманием вашего вопроса вот мое решение:
m$new_column <- ifelse(grepl("string", m$ref_column), ifelse(is.na(m$x), 0, ifelse(m$x <= 0.17, 1, 2)), 3)
Этот код сначала проверит строку в столбце ссылки в той же строке. Если он не найдет, он будет равен 3. Если он найдет его, он перейдет во второй блок ifelse.
- В этом блоке он сначала проверяет наличие NA и присваивает 0, иначе он переходит в 3-й блок ifelse, где, наконец, проверяет, имеет ли ваш столбец «x» значение 0,17 или меньше, и присваивает 1 else 2.
Надеюсь это поможет
Можно использовать серию правильно проиндексированных назначений:
dat <- data.frame( x=runif (20), ref_col=sample( c("string", "not string"), 20, repl=TRUE) )
dat$new_col[dat$x > 0.17 & dat$ref_col= = "string"] <- 2
dat$new_col[dat$x <= 0.17 & dat$ref_col= = "string"] <- 1
dat$new_col[ is.na(dat$x)] <- 0
dat$new_col[ dat$ref_col != "string"] <- 3
dat
В моих крестиках не было никаких NA, но я предполагаю, что они были бы правильно назначены
ЭТО СРАБОТАЛО! за исключением того, что я заменил здесь «x» на имя столбца x. Большое спасибо.