【问题标题】:R: Using for loop to subset columns from a data.frame with dynamic nameR:使用for循环从具有动态名称的data.frame中子集列
【发布时间】:2016-12-14 21:35:57
【问题描述】:

我想从一个主数据帧中获取三个子数据帧。当我运行下面的代码时,我不断收到这样的错误消息。

[.data.frame(x, r, vars, drop = drop) 中的错误: 选择了未定义的列

x <- matrix(rnorm(30, 1), nrow = 10, ncol = 26)
z <- c(1, seq(10))

x <- cbind(z, x) #combining 

master = data.frame(x)
start = c(9,14,21) # subset starts from the column ..
end = c(14,21,27) # subset ends with the column ..
grup = c('dm', 'latam', 'ceemea', 'asia')

for (x in 2:4) {
  for (i in start) {
    for (j in end) {
      if(i<j && j-i <=10) {
         assign(paste('ret', grup[x], sep='.'), 
             subset(master, select =  c(1, (i+1):j)))
            }
         }
      }
   }

有人可以帮帮我吗?请。

我的愿望输出是:

ret.latam = master[, c(1, 10:14)] 
ret.ceemea = master[, c(1, 15:21)] 
ret.asia = master[, c(1, 22:27)]

【问题讨论】:

  • 你想要的输出是什么?
  • 我想要这样的子 df,ret.latam = master[, c(1, 10:14)], ret.ceemea = master[, c(1, 15:21)] , ret.asia = master[, c(1, 22:27)],

标签: r loops dynamic dataframe subset


【解决方案1】:

请注意,i + 1:j(i + 1):j 不同。

第一种情况是要求添加 i 和从 1 到 j 的系列,所以 R 将返回系列 1 到 j,将 i 添加到其每个元素。这会导致值超出主数据集中的列数。

第二种情况是从i1j的值求一个系列,也就是你想要的值到子集。

放置正确的括号会返回您想要的输出。

for (x in 2:4) {
      for (i in start) {
        for (j in end) {
          if(i<j && j-i <=10) {
            assign(paste('ret', grup[x], sep='.'), 
                   subset(master, select =  c(1, (i+1):j)))
          }
        }
      }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    • 2014-02-10
    • 2022-12-12
    • 1970-01-01
    • 1970-01-01
    • 2017-12-30
    相关资源
    最近更新 更多