【问题标题】:Fill a row with a value until column index saved in a variable of dataframe用值填充一行,直到列索引保存在数据框的变量中
【发布时间】:2015-04-19 01:00:45
【问题描述】:

我正在尝试解决 R 中数据框的一个小问题。我的数据框 Base 看起来像这样(我在最后一面添加了 dput() 版本):

   ID I1 I2 I3 Col
1 001  0  2  1   2
2 002  1  2 NA   3
3 003  3  2 NA   1

我的数据框有一个 id 变量、数字变量 (I1,I2,I3) 和一个名为 Col 的索引变量。我想用1 的值填充所有行,从I1 列开始,直到其索引保存在Col 中的列。例如,在第二行Col 显示值为3 的情况下,使用1 的填充过程应该从列I1 开始,直到列I3。相同的逻辑适用于其他行。我已经尝试过这个解决方案,但它不起作用:

Base[-1] <- apply(Base[2:5],1,function(x) {x[1:x[4]]=1})

因为此代码使用1 填充所有行,而不考虑保存在Col 中的索引列。有了这段代码,我得到了这个:

   ID I1 I2 I3 Col
1 001  1  1  1   1
2 002  1  1  1   1
3 003  1  1  1   1

我想得到这样的数据框:

   ID I1 I2 I3 Col
1 001  1  1  1   2
2 002  1  1  1   3
3 003  1  2 NA   1

另外,我尝试通过x[1:x[x[4]]]=1 更改函数内部的x[1:x[4]]=1,但它不起作用。 dput() 版本的 Base 是下一个:

Base=structure(list(ID = c("001", "002", "003"), I1 = c(0, 1, 3), 
    I2 = c(2, 2, 2), I3 = c(1, NA, NA), Col = c(2, 3, 1)), .Names = c("ID", 
"I1", "I2", "I3", "Col"), row.names = c(NA, -3L), class = "data.frame")

感谢您的帮助。

【问题讨论】:

    标签: r


    【解决方案1】:

    一种方法是创建一个矩阵,其中包含要更改为 1 的值的行、列索引。然后,您可以使用此矩阵对 data.frame 中的值进行子集化和替换。例如

    idx <- do.call(rbind, Map(function(a,b) 
        cbind(a,match(paste0("I",1:b), colnames(Base))), 
        seq_along(Base$Col), Base$Col))
    
    Base[idx]<-1
    

    给了

       ID I1 I2 I3 Col
    1 001  1  1  1   2
    2 002  1  1  1   3
    3 003  1  2 NA   1
    

    根据需要。

    但是回到您最初的尝试,问题在于向量回收(和错误转置)。当您进行赋值 (x&lt;-1) 时,返回的值是右侧值 (1)。该值最终被回收以填充列的长度。您希望从您的函数中返回全长(转换后的)x,而不仅仅是您替换的值。您传递给 apply 的函数不会就地进行更改,它期望返回新值。所以你可以这样做

    Base[-1] <- t(apply(Base[2:5],1,function(x) {x[1:x[4]]=1; x}))
    

    Base[-1] <- t(apply(Base[2:5],1,function(x) {replace(x,1:x[4],1)}))
    

    由于apply() 返回值的方式,我还必须添加t() 来转置返回的矩阵。

    【讨论】:

      【解决方案2】:

      这可以通过row/column索引来完成

      Base[-1][cbind(rep(1:nrow(Base), Base$Col), sequence(Base$Col))] <- 1
      Base
      #   ID I1 I2 I3 Col
      #1 001  1  1  1   2
      #2 002  1  1  1   3
      #3 003  1  2 NA   1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-11
        • 1970-01-01
        • 2023-01-16
        • 2022-07-11
        • 2017-11-16
        • 2013-12-23
        相关资源
        最近更新 更多