[英]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.