2016-11-08 96 views
0

我有一個數據框列表,對於每個列表,我想將特定列乘以10。我通常使用python,並且在R中完成此操作時遇到問題。在蟒蛇這將是東西這樣的效果:遍歷df列表並在R中返回df

files.list = list(zt2, zt6, zt10, zt14, zt18, zt22) 

for (f in files): 
    for (i in 3:ncol(f)){ 
     f[i] = f[i]*10 
    } 
} 

然而,在R,這是簡單地創建DF「f」和存儲我的最後一次迭代的值DF它。在R中做這件事的正確方法是什麼?

+0

Python的大熊貓沒有'的NcoI()'。在pandas中,在循環中使用apply:'colrng = list(range(3,len(df.columns))); f [colrng] = f [colrng] .apply(lambda col:col * 10,axis = 1)' – Parfait

回答

1

你並不需要一個雙循環,一個就夠了:

a <- data.frame(a=1:10,b=2:11,c=3:12) 
b <- a*2 
c <- a^2 

files.list <- list(a,b,c) 

for(i in 1:length(files.list)){ 
    files.list[[i]] <- files.list[[i]]*10 
} 

檢查DF的頭:

head(files.list[[1]]) 

    a b c 
1 10 20 30 
2 20 30 40 
3 30 40 50 
4 40 50 60 
5 50 60 70 
6 60 70 80 
+0

並非所有列都乘以10,只有從3到最後一列。在這種情況下,執行'files.list [[i]] [,3:ncol(files.list [[i]])] - files.list [[i]] [,3:ncol(files.list [我]])] * 10' –

0

使用lapply另一種解決方案和示例從@aldo_tapia數據:

a <- data.frame(a=1:10,b=2:11,c=3:12) 
b <- a*2 
c <- a^2 

files.list <- list(a,b,c) 

lapply(files.list, function(x) x[,3:ncol(x)] * 10) 
+0

@Parfait編輯。 – Zach

+0

@Parfait當然好了,如果他想要將第三列向前推並且測試數據集有三列,那麼它當然只返回一列。 – Zach

+0

對不起,我錯誤的術語,OP希望只改變第3列,但保留整個DF。 – Parfait

1

看起來你可能有不同數量的列,並且想要t Ø通過10.通過最後一列的多個第3列,我會用lapply

# Sample data: 
files.list = list(mtcars, data.frame(x = letters, y = runif(26), z = rnorm(26))) 

files.list = lapply(files.list, function(d) { 
    d[3:ncol(d)] = d[3:ncol(d)] * 10 
    return(d) 
}) 

這相當於一個for循環:

for (i in seq_along(files.list)) { 
    d = files.list[[i]] 
    d[3:ncol(d)] = d[3:ncol(d)] * 10 
    files.list[[i]] = d 
} 

你也寫了for循環修改數據幀就位,但這涉及到很多括號:

for (i in seq_along(files.list)) { 
    files.list[[i]][3:ncol(files.list[[i]])] = files.list[[i]][3:ncol(files.list[[i]])] * 10 
} 

雖然可以改進如果我們用df[-(1:2)]省略前兩列,而不是通過df[3:ncol(df)]第n選擇第三個:

for (i in seq_along(files.list)) { 
    files.list[[i]][-(1:2)] = files.list[[i]][-(1:2)] * 10 
}