【问题标题】:looping over the name of the columns in R for creating new columns循环遍历 R 中列的名称以创建新列
【发布时间】:2013-03-04 20:32:30
【问题描述】:

我正在尝试对现有数据框的列名使用循环,然后根据旧列之一创建新列。这是我的示例数据:

 sample<-list(c(10,12,17,7,9,10),c(NA,NA,NA,10,12,13),c(1,1,1,0,0,0))
    sample<-as.data.frame(sample)
    colnames(sample)<-c("x1","x2","D")

>sample
x1  x2  D
10  NA  1
12  NA  1
17  NA  1
7   10  0
9   20  0
10  13  0

现在,我正在尝试使用 for loop 生成两个变量 x1.imp 和 x2.imp,它们的值在 D=1 时与 D=0 相关,在 D=0 时与 D=1 相关(这里我实际上不需要for loop,但是对于我的原始数据集(具有大列(变量),我真的需要循环)基于以下条件:

for (i in names(sample[,1:2])){
sample$i.imp<-with (sample, ifelse (D==1, i[D==0],i[D==1]))
i=i+1
return(sample)
}


Error in i + 1 : non-numeric argument to binary operator

但是,以下方法有效,但它没有将新列的名称命名为 imp.x2 和 imp.x3

for(i in sample[,1:2]){
impt.i<-with(sample,ifelse(D==1,i[D==0],i[D==1]))
i=i+1
print(as.data.frame(impt.i))
 }

impt.i
1      7
2      9
3     10
4     10
5     12
6     17
  impt.i
1     10
2     12
3     13
4     NA
5     NA
6     NA

请注意,我已经知道没有 loop [here] 的解决方案。我想要循环。

预期输出:

x1  x2  D   x1.impt x2.imp 
10  NA  1   7       10      
12  NA  1   9       20
17  NA  1   10      13
7   10  0   10      NA
9   20  0   12      NA
10  13  0   17      NA

非常感谢您在这方面的宝贵意见。

【问题讨论】:

    标签: r if-statement for-loop


    【解决方案1】:

    这应该可行,

    test <- sample[,"D"] == 1
    for (.name in names(sample)[1:2]){
      newvar <- paste(.name, "impt", sep=".")
      sample[[newvar]] <- ifelse(test, sample[!test, .name], 
                                       sample[test, .name]) 
    }
    
    sample
    

    【讨论】:

      【解决方案2】:

      这太疯狂了,但既然您要求这样做...您的代码更改最少:

      for (i in colnames(sample)[1:2]){
        sample[[paste0(i, '.impt')]] <- with(sample, ifelse(D==1, get(i)[D==0],get(i)[D==1]))
      }
      

      几个cmets:

      1. names(sample[,1:2]) 替换为更优雅的colnames(sample)[1:2]
      2. $ 用于交互使用。相反,在编程时,即要解释列名时,您需要使用[[[,因此我将sample$i.imp 替换为sample[[paste0(i, '.impt')]]
      3. with 内部,当i"x1" 时,i[D==0] 不会给你x1[D==0],因此需要使用get 取消引用它。
      4. 你不应该将你的data.frame命名为sample,因为它也是一个非常常见的函数的名称

      【讨论】:

      • 5. with 也最好仅用于交互使用
      • 6.这真的,真的很疯狂……你能解释一下为什么你觉得有必要这样做吗?我只是无法想象有必要这样做的情况
      • 我同意你们俩。 @alexwhan,我希望你问的是 OP,而不是我,对吧?!
      猜你喜欢
      • 2021-03-06
      • 2015-08-11
      • 1970-01-01
      • 1970-01-01
      • 2010-12-09
      • 2021-03-31
      • 2018-09-28
      • 2021-09-18
      相关资源
      最近更新 更多