簡體   English   中英

R:for循環解決方案,用於從多個數據幀中刪除列

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM