[英]R: for-loop solution to deleting columns from multiple data frames
我的问题可能很简单,但我认为我的代码肯定可以改进。 现在是两个for循环,但是我敢肯定有一种方法可以在一个循环中完成我需要的操作,因为我一生都看不到它是什么。
搜索了Stack之后,我从Ananda找到了一个很好的答案,他可以使用lapply和for-loop方法提取列并将列保持在一定范围内。 但是,由于我希望能够选择要删除的特定列,因此数据的结构受到影响。 我的数据结构如下所示:
1 AAAT_1 1 GROUP **** 1 -13.70 0
2 AAAT_2 51 GROUP **** 1 -9.21 0
3 AAAT_3 101 GROUP **** 1 -7.60 0
4 AAAT_4 151 GROUP **** 1 -6.28 0
它是从某些对接软件中提取的,我要保留的唯一列是2(例如AAAT_1)和7(例如-13.70)。 我曾经用过的代码是两个for循环:
for (i in 1:length(temp)) {
assign(temp[i], get(temp[i])[2:7])
}
....以保留第2-7列中的数据,然后是:
for (i in 1:length(temp)) {
assign(temp[i], get(temp[i])[-2:-5])
}
....删除其余不需要的列,其中temp [i]只是循环所作用的数据帧的列表。
因此,如您所见,只有两个循环在执行类似的动作。 当然,有一种方法可以选择要保留/删除的特定列,并在一个loop / lapply语句中完成所有操作? 尝试在get
语句中进行[2,7]
之类的操作不起作用,似乎只保留第7列,而是将每个数据帧转换为“值”。 我不确定会发生什么,因此任何见解都将是美好的,但是,无论哪种方式,如果有人可以将这种两回路解决方案变成一个,那将非常感激。 绝对感觉到我缺少真正简单/明显的东西。
干杯。
编辑:考虑了下面的向量化解决方案,而不是执行以下操作。 原始导入数据的名称以F0001,F0002等开头,因此是构成初始list
的模式。
lst <- mget(ls(pattern='^F\\d+'))
lst <- lapply(lst, "[", TRUE, c("V2","V7") )
lst <- lapply(seq_along(lst),
function(i,x) {assign(paste0(temp[i]),x[[i]], envir=.GlobalEnv)},
x=lst)
我知道循环在R中表现不好,作为CPP程序员,这对我来说是很自然的解决方案,但是,这要快得多。 最初, 另一个示例的唯一缺点是,当原始导入的数据文件列表不完全位于列表中时, assign
命令将字母按顺序1、2、3,...,n粘贴到每个已创建的表中数字顺序(即1,2,3,5,6,10等),因此这并没有保留该顺序。 因此,我不得不使用文件列表(我们的老朋友temp
)正确地命名它们。 小事情和代码并不比两个循环短很多,但是肯定更快。
因此,简而言之,以上三行将所有导入的原始数据添加到列表中,仅保留我需要的列,然后将列表拆分为单独的数据框,同时保留正确的名称。 为帮助加油!
如果有数据框,则使用
data.frame[row, column]
因此, data.frame[2,7])
将为您提供第七列中第二行的值。 我想你在找
temp <- temp[, c(2,7)]
或者,如果temp
是数据帧列表
temp <- lapply(temp, function(x) x[, c(2,7)])
因此,如果要将数字向量用作列或行索引,请使用c(...)
创建此向量。 如果我正确理解了您的示例,那么如果您使用lapply
,则不需要任何循环命令。
一个for
循环? 也许我错过了一些东西,但是为什么不使用@Daniel提出的解决方案或像这样的dplyr
方法。
data
V1 V2 V3 V4 V5 V6 V7 V8
1 1 AAAT_1 1 GROUP **** 1 -13.70 0
2 2 AAAT_2 51 GROUP **** 1 -9.21 0
3 3 AAAT_3 101 GROUP **** 1 -7.60 0
4 4 AAAT_4 151 GROUP **** 1 -6.28 0
这里的代码:
library(dplyr)
data <- select(data, V2, V7)
data
V2 V7
1 AAAT_1 -13.70
2 AAAT_2 -9.21
3 AAAT_3 -7.60
4 AAAT_4 -6.28
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.