我想知道是否有一种很好的方法可以删除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
循环是最好的方法,我该如何设置?
答案 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}}