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

在R中删除不同数据集中的多列,r,for-loop,R,For Loop,我想知道是否有一种很好的方法可以删除R中几个不同数据集上的多个列。我有一个如下数据集: RangeNumber Time Value Quality Approval 1 2:00 1 1 1 2 2:05 4 2 1 我想删除数据集中除时间和值列以外的所有内容。我通过将每列设置为NULL来“删除”它们,即:data

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

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

我想删除数据集中除时间和值列以外的所有内容。我通过将每列设置为NULL来“删除”它们,即:
data1$RangeNumber而不是删除,只需选择所需的列,即

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

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

您希望将这些数据帧收集到一个列表中,然后对其运行提取功能。“[”的第一个参数应为TRUE,以便获得所有行,第二个参数应为列名(我由三个数据帧组成,它们的行号和列名不同,但都有“Time”和“Value”列:

> 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
如果您对R非常陌生,您可能没有发现最后一个代码没有改变TimVal;它只显示了将返回的值,并且为了使效果持久,您需要指定一个名称。甚至可能是相同的名称:

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

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

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

这两个选项几乎相同。一个选项使用
lappy()
,另一个选项使用
表示

  • lappy

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

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

    因为我希望大多数数据帧都有大约50000行数据,所以我试图通过删除不需要的数据来了解内存使用情况。如果我决定将它们合并,我喜欢使用
    id
    列。@qmoog,如果您希望在所有16个或更多的数据集上执行相同的计算,我也推荐这种方法在这种情况下,拥有
    数据.frame
    s的
    列表可以非常方便。这似乎是一个很好的方法。我现在就尝试一下。这是一个很好的答案,因为它不仅允许我选择所需的列,还可以在数据列表中运行另一个函数,将其他列设置为
    NULL
    。感谢@mrdwab和@DWinI在面临类似问题时遇到了这个解决方案,我想了解
    [
    lappy(datlist,“[”,TRUE,c(“Time”,“Value”)中的角色是什么
    ?这是制作副本的一个公平点。我的数据来自只读源,因此不必担心删除无关的列。@qmoog,好的。正如我在回答中提到的,我从您的问题的方式假设数据集已经在您的工作区中,因此建议使用此方法。不用担心。我应该我在最初的问题中提到了这一点。
    temp <- ls(pattern = "data[0-9+]")
    for (i in 1:length(temp)) {
      assign(temp[i], get(temp[i])[2:3])
    }
    
    lapply(ls(pattern = "data[0-9+]"),
           function(x) { assign(paste(x, "T", sep="."), 
                                get(x)[2:3], envir = .GlobalEnv) })