2017-05-23 27 views
0

循環這個腳本工作正常使用與發生變異

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

不過,我想作一個循環,因爲我想將它應用到130個colums

我想這一點,但它返回一個額外列

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

任何人都可以幫忙嗎?

+2

可能你也許增加一個(https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) – Vandenman

+0

要將'ifelse()'應用於每列,可以使用功能基R sapply()並避免循環。 –

+3

您應該查看'?mutate_each'和/或'?mutate_all' –

回答

0

而是發生變異,可以在循環分配新列

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) 
} 
0

相反的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 
+0

完美!這兩種解決方案都很好 – Mieke