3

Rのいくつかの異なるデータセットで複数の列を削除する良い方法があるかどうか疑問に思っています.次のようなデータセットがあります:

RangeNumber    Time    Value    Quality    Approval
          1    2:00        1          1           1
          2    2:05        4          2           1

また、データ セットの Time 列と Value 列以外はすべて削除したいと考えています。各列を NULL に設定して、それらを「削除」していますdata1$RangeNumber <- NULL

同一の列設定を持つ 16 以上のデータ セットがあり、データ セットには増分順に番号が付けられます (例: data1、data2、data3、&c)。

forすべてのデータセット列を反復するループがこれを達成するための最良の方法であるかどうか、または、R がループで遅いことを読んだので、forこれを行うためのより簡単な方法があるかどうか疑問に思っています。また、すべてのデータ セットを 1 つの変数に結合し、反復して列を削除する必要があるかどうかも疑問に思っています。

ループが最善の方法である場合for、どのように設定しますか?

4

3 に答える 3

2

You want to gather those dataframes into a list and then run the Extract function over them. The first argument given to "[" should be TRUE so that all rows are obtained, and the second argument should be the column names (I made up three dataframes that varied in their row numbers and column names but all had 'Time' and 'Value' columns:

> 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

This is added in case the goal was to have them all together in the same dataframe:

> 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

If you are very new to R you may not have figured out that the last code did not change TimVal; it only showed what value would be returned and to make the effect durable you would need to assign to a name. Perhaps even the same name:

TimVal <- do.call(rbind, TimVal):
于 2012-09-19T17:05:22.590 に答える
1

削除するのではなく、必要な列を選択するだけです。

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

など、他のデータセットについてはまだ疑問が残っていますdata2。データフレームはすべて「類似」しているため、それらを単一のデータフレームに結合してid、データセット番号を示す追加の識別子列 を追加できるのではないかと思います。データ セットの結合方法は、データの保存方法によって異なります。しかし、通常はforループ オーバーread.csvを使用します。

于 2012-09-19T16:39:10.983 に答える
0

これらはかなり「破壊的な」方法であるため、これらを推奨する必要があるかどうかはわかりません....試す前に、元のデータのバックアップがあることを確認してください;-)

このアプローチは、データセットが既にワークスペースにあり、それらの新しいバージョンが必要であることを前提としています。

これらはどちらもほとんど同じです。1 つのオプションは を使用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、元の s を上書きする代わりに新しい s を作成することです。このような何かがうまくいくはずです:

lapply(ls(pattern = "data[0-9+]"),
       function(x) { assign(paste(x, "T", sep="."), 
                            get(x)[2:3], envir = .GlobalEnv) })
于 2012-09-19T17:21:14.297 に答える