如何遍历R数据框中的列并使用每次迭代中的列名创建新数据框?

时间:2018-01-11 08:11:39

标签: r for-loop dataframe

我有一个R数据框dftotal

i  A  B C  D
1  4 15 4 12
2 13  4 4  7 
3  1  1 3  8 
4  3 11 1  9 

我想写一个遍历列(A,B,C,D)的循环,每次都创建一个新的数据帧,这样我就有了每列的数据框:

DFA:

i  A  
1  4 
2 13  
3  1   
4  3 

和dfB:

i  B 
1 15 
2  4 
3  1  
4 11 

等...

我试过了:

List <- colnames(dftotal)
List <- List[-1]
for (j in length(List)) 
    {
      df <- data.frame(dftotal$i,dftotal[List[j]]) 
      assign(paste("df",List[j]), df)

    }

但是这只返回了我列表中最后一列的数据框。它似乎覆盖了循环中创建的其他数据帧。

df <- data.frame(dftotal$i,dftotal[List[1]]) 
      assign(paste("df",List[1]), df)

当我手动逐列运行时,工作正常。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

记录 - 回答你做错了什么的问题:

for (j in length(List))

应该是

for (j in 1:length(List))

答案 1 :(得分:0)

  

假设下面是向量

i <- c(1,2,3,4)
A <- c(4,13,1,3)
B <- c(15,4,1,11)
C <- c(4,4,3,1)
D <- c(12,7,8,9)
  

所有i,A,B,C,D的数据框

MM <- cbind(i,A,B,C,D)
MM <- data.frame(MM)

List <- colnames(MM)
List <- List [-1]
  

创建特定数据帧df1,df2,df3和df4的功能

for (j in 1:length(List)) {

df <- data.frame(MM$i,MM[,List[j]])   colnames(df) <- c("i", paste("df",List[j], sep = ""))   assign(paste("df",j, sep = ""),df) }