删除R中不同数据集中的多个列

时间:2012-09-19 16:37:22

标签: r for-loop

我想知道是否有一种很好的方法可以删除R中几个不同数据集的多个列。我有一个看起来像这样的数据集:

RangeNumber    Time    Value    Quality    Approval
          1    2:00        1          1           1
          2    2:05        4          2           1

我想删除数据集中除时间和值列之外的所有内容。我通过将每列设置为NULL来“删除”它们,e.x。:data1$RangeNumber <- NULL

我将拥有16个或更多具有相同列设置的数据集,并且数据集将按增量顺序编号,e.x。:data1,data2,data3和&amp; c。

我想知道迭代所有数据集列的for循环是否是实现此目的的最佳方法,或者 - 因为我已经读过在for循环中R很慢 - 如果有更简单的方法可以做到这一点。我也想知道是否需要将所有数据集合并到一个变量中,然后迭代以删除列。

如果for循环是最好的方法,我该如何设置?

3 个答案:

答案 0 :(得分:2)

您希望将这些数据帧收集到列表中,然后对它们运行Extract函数。给出“[”的第一个参数应为TRUE,以便获得所有行,第二个参数应为列名(我组成了三个数据帧,它们的行号和列名不同,但都有'时间'和'值'列:

> datlist <- list(dat1,dat2,dat3)
> TimVal <- lapply(datlist, "[", TRUE, c("Time","Value") )
> TimVal
[[1]]
  Time Value
1 2:00     1
2 2:05     4

[[2]]
  Time Value
1 2:00     1
2 2:05     4

[[3]]
    Time Value
1   2:00     1
2   2:05     4
2.1 2:05     4
1.1 2:00     1

如果目标是将它们全部放在同一个数据框中,则会添加此内容:

> do.call(rbind, TimVal)
    Time Value
1   2:00     1
2   2:05     4
3   2:00     1
4   2:05     4
11  2:00     1
21  2:05     4
2.1 2:05     4
1.1 2:00     1

如果你是R的新手,你可能没有发现最后一个代码没有改变TimVal;它只显示返回的值,并使效果持久,您需要分配给一个名称。甚至可能是同一个名字:

TimVal <- do.call(rbind, TimVal):

答案 1 :(得分:1)

而不是删除,只需选择您想要的列,即

data1 = data1[, c(2, 3)]

关于您的其他数据集的问题仍然存在:data2等。我怀疑由于您的数据框都“相似”,您可以将它们组合到一个带有附加标识符列的数据框中,{ {1}},它告诉您数据集编号。如何组合数据集取决于数据的存储方式。但通常情况下,id上的for循环是可行的方法。

答案 2 :(得分:0)

我不确定是否应该推荐这些,因为这些是相当“破坏性”的方法....确保在尝试之前备份原始数据; - )

此方法假设数据集已经在您的工作区中,您只需要它们的新版本。

这两者几乎相同。一个选项使用lapply(),另一个选项使用for

  • lapply

    lapply(ls(pattern = "data[0-9+]"),
           function(x) { assign(x, get(x)[2:3], envir = .GlobalEnv) })
    
  • for

    temp <- ls(pattern = "data[0-9+]")
    for (i in 1:length(temp)) {
      assign(temp[i], get(temp[i])[2:3])
    }
    

基本上,ls(.etc.)将在工作空间中创建与您提供的命名模式匹配的数据集矢量。然后,编写一个小函数来选择要保留的列。

一种不那么“破坏性”的方法是创建新的data.frame而不是覆盖原始的lapply(ls(pattern = "data[0-9+]"), function(x) { assign(paste(x, "T", sep="."), get(x)[2:3], envir = .GlobalEnv) }) 。这样的事情可以解决问题:

{{1}}