3

我想知道是否有一种好方法可以删除 R 中几个不同数据集的多个列。我有一个数据集,如下所示:

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

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

我将拥有超过 16 个或更多具有相同列设置的数据集,并且数据集将按递增顺序编号,例如:data1、data2、data3 等。

我想知道for遍历所有数据集列的循环是否是完成此任务的最佳方法,或者——因为我已经读到 R 在循环时很慢for——是否有更简单的方法可以做到这一点。我还想知道是否需要将所有数据集合并到一个变量中,然后遍历以删除列。

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

4

3 回答 3

2

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

> 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):
于 2012-09-19T17:05:22.590 回答
1

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

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

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

于 2012-09-19T16:39:10.983 回答
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的 s 而不是覆盖原来的。这样的事情应该可以解决问题:

lapply(ls(pattern = "data[0-9+]"),
       function(x) { assign(paste(x, "T", sep="."), 
                            get(x)[2:3], envir = .GlobalEnv) })
于 2012-09-19T17:21:14.297 回答