использовать цикл с изменением

Этот скрипт отлично работает

F <- mutate(F, "1" = ifelse(dt == 1,1,0))

Однако я бы хотел сделать цикл, потому что я хочу применить его к 130 столбцам.

Я пробовал это, но он возвращает один лишний столбец

for (i in 1:130) {
F <- mutate(F, "i" = ifelse(dt == i, 1, 0))
}

Кто-нибудь может помочь?


person Mieke    schedule 23.05.2017    source источник
comment
не могли бы вы добавить воспроизводимый пример?   -  person Vandenman    schedule 24.05.2017
comment
Чтобы применить ifelse () к каждому столбцу, вы можете использовать функциональную базу R, например. sapply () и избегайте цикла.   -  person Edgar Santos    schedule 24.05.2017
comment
Вам следует проверить ?mutate_each и / или ?mutate_all   -  person Ian Wesley    schedule 24.05.2017
comment
Как предположил @IanWesley, использование mutate_all было бы очень простым способом обойти это. Если у вас есть другие столбцы, к которым вы не хотите применять его, просто выберите их перед вызовом mutate_all.   -  person Phil    schedule 24.05.2017


Ответы (2)


Вместо mutate вам придется использовать mutate_, который является «стандартной оценочной» версией mutate, что означает, что вы можете использовать аргументы в кавычках. Вот код:

## Sample data:
set.seed(1000)

F <- data.frame(dt = sample.int(5, 20, replace = TRUE))
## Your loop:
for (ii in 1:5){
    F <- F %>% mutate_(.dots = setNames(list(paste0("ifelse(dt == ", ii, ",1,0)")), ii))
}

head(F)
#   dt 1 2 3 4 5
# 1  2 0 1 0 0 0
# 2  4 0 0 0 1 0
# 3  1 1 0 0 0 0
# 4  4 0 0 0 1 0
# 5  3 0 0 1 0 0
# 6  1 1 0 0 0 0
person ikop    schedule 24.05.2017

Вместо изменения вы можете назначать новые столбцы в цикле

x <- runif(100, 0, 1)
y <- runif(100, 0, 1)
class <- round(runif(100, 0, 1))
df <- data.frame(cbind(x, y, class))

df <- mutate(df, "1" = ifelse(x == 1,1,0))

for(i in 1:130){
  print(i)
  cola <- paste('col', i, sep= '')
  df[[cola]] <- ifelse(x == i, 1, 0)
}
person sairaamv    schedule 23.05.2017