2012-09-19 74 views
3

我不知道是否有過幾個不同的數據集R.我有一個數據集,看起來刪除多個列的好方法,如:刪除不同的數據集的多個列中的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,& c。

我想知道如果for循環遍歷所有的數據集列是實現這一目標的最好方法,或者 - 因爲我已經讀了R在for循環處緩慢 - 如果有一個更容易這樣做的方法。我也想知道是否需要將所有數據集合到一個變量中,然後迭代刪除列。

如果for循環是最好的方法,我該如何設置它?

回答

2

您想要將這些數據幀收集到列表中,然後對它們運行提取功能。給「」的第一個參數應該是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;它只顯示將返回什麼值,並使該效果持久,你需要分配給一個名字,或許甚至是相同的名字:

​​
+0

@qmoog,如果您預計必須在所有16個或更多數據集中執行相同的計算,我也推薦這種方法。在這種情況下,擁有'data.frame'的'list'可以非常方便。 – A5C1D2H2I1M1N2O1R2T1

+0

這似乎是一個好方法。我現在要試一試。 – qmoog

+0

這是一個很好的答案,因爲它不僅允許我選擇需要的列,還可以在數據列表中運行另一個函數以將其他列設置爲NULL。感謝@mrdwab和@DWin – qmoog

1

而不是刪除,只需選擇你想要的列,即

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

問題仍然是關於你的其他數據集:data2,等我懷疑,因爲您的數據幀都「差不多」 ,您可以將它們與一個附加標識符列id組合成單個數據框,該列會告訴您數據集編號。如何組合數據集取決於數據的存儲方式。但通常情況下,需要循環read.csvfor即可。

+0

由於我最期待的數據幀有50000〜行的數據,我想是被刪除的內容,我不需要有意識的內存使用量。如果我決定合併它們,我喜歡'id'列的想法。 – qmoog

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) }) 
+0

這是一個關於複製的公平點。我的數據來自只讀來源,所以不必擔心刪除多餘的列。 – qmoog

+0

@qmoog,好的。正如我在我的回答中提到的那樣,我從你提出的問題的角度假定數據集已經存在於你的工作空間中,因此這種建議方法。 – A5C1D2H2I1M1N2O1R2T1

+0

不用擔心。我應該在我原來的問題中提到這一點。 – qmoog