「どうですか...?」しかし、もっと「お元気ですか...」
誰かが200カラムを与えてくれたファイルがあり、それを分析に必要ないくつかのカラムに減らしたい場合、どうすればいいですか?あるソリューションは別のソリューションよりも利点がありますか?
列col1、col2からcol200のデータフレームがあると仮定します。 1から100までしか必要とせず、125から135までと150から200までしか必要ない場合は、次のようにします。
dat$col101 <- NULL
dat$col102 <- NULL # etc
または
dat <- dat[,c("col1","col2",...)]
または
dat <- dat[,c(1:100,125:135,...)] # shortest probably but I don't like this
または
dat <- dat[,!names(dat) %in% c("dat101","dat102",...)]
私が不足しているものはありますか?これは見た目が主観的であることを知っていますが、それはあなたが飛び込んで一方向にそれを始め、はるかに効率的な方法があるときに習慣に陥る可能性のある重要なザラザラしたものの1つです。 which についてのこの質問とよく似ています。
編集:
または、列名の実用的なベクトルを作成する簡単な方法はありますか? name(dat)は、上記のコード例で必要なカンマを使用してそれらを出力しません。したがって、そのように名前を出力すると、どこにでもスペースがあり、手動でカンマを入力する必要があります...出力として "col1"、 "col2"、 "col3"、...を提供するコマンドで、必要なものを簡単に取得できますか?
data.table の:=
演算子を使用して、テーブルのサイズに関係なく列を即座に削除します。
DT[, coltodelete := NULL]
または
DT[, c("col1","col20") := NULL]
または
DT[, (125:135) := NULL]
または
DT[, (variableHoldingNamesOrNumbers) := NULL]
<-
またはsubset
を使用するソリューションは、wholeテーブルをコピーします。 data.table の:=
演算子は、列へのポインターの内部ベクトルを適切に変更するだけです。したがって、その操作は(ほぼ)瞬時です。
単一の列を削除するには、dat$x <- NULL
。
複数の列を削除するが、約3〜4未満の場合は、dat$x <- dat$y <- dat$z <- NULL
。
それ以上の場合、subset
を使用して、負の名前(!)を付けます。
subset(mtcars, , -c(mpg, cyl, disp, hp))
わかりやすくするために、subset
でselect引数をよく使用します。新しい人たちと、私は彼らが必要とするコマンドの数を最小限に抑えることは採用に役立つことを学びました。スキルが向上するにつれて、コーディング能力も向上します。また、サブセットは、特定の条件内でデータを選択する必要があるときに表示する最初のコマンドの1つです。
何かのようなもの:
> subset(mtcars, select = c("mpg", "cyl", "vs", "am"))
mpg cyl vs am
Mazda RX4 21.0 6 0 1
Mazda RX4 Wag 21.0 6 0 1
Datsun 710 22.8 4 1 1
....
これは他のほとんどのソリューションよりもテストが遅くなると確信していますが、マイクロ秒が違いを生む時点ではめったにありません。
Read.tableを "NULL"のcolClassesインスタンスと共に使用して、そもそもインスタンスを作成しないようにします。
## example data and temp file
x <- data.frame(x = 1:10, y = rnorm(10), z = runif(10), a = letters[1:10], stringsAsFactors = FALSE)
tmp <- tempfile()
write.table(x, tmp, row.names = FALSE)
(y <- read.table(tmp, colClasses = c("numeric", rep("NULL", 2), "character"), header = TRUE))
x a
1 1 a
2 2 b
3 3 c
4 4 d
5 5 e
6 6 f
7 7 g
8 8 h
9 9 i
10 10 j
unlink(tmp)
取得する傾向のある大きなファイルの種類については、一般にRでもこれを行いません。Linuxでcut
コマンドを使用して、Rに到達する前にデータを処理します。これは批評ではありませんR、正規表現についてやるべきことがあるときにgrep、tr、cut、sort、uniq、sed&awk(またはPerl)などの非常に基本的なLinuxツールを使用するための好み。
標準のGNUコマンドを使用するもう1つの理由は、コマンドをデータのソースに戻し、余分なデータが得られないようにデータを事前にフィルター処理するように依頼できることです。 Linuxに対応しており、Rを知っている人はほとんどいません。
(更新)やがて使用したい方法は、mmap
をテキストファイルとペアにして、データをRAMに読み込むのではなく、in sitを調べることです。私はこれをCで実行しましたが、非常に高速です。
代わりに、列IDを使用してこれを実行したいことがあります。
df <- data.frame(a=rnorm(100),
b=rnorm(100),
c=rnorm(100),
d=rnorm(100),
e=rnorm(100),
f=rnorm(100),
g=rnorm(100))
as.data.frame(names(df))
names(df)
1 a
2 b
3 c
4 d
5 e
6 f
7 g
列「c」および「g」の削除
df[,-c(3,7)]
これは、data.framesが大きい場合や、入力したくない長い列名がある場合に特に便利です。または、パターンに続く列名。seq()を使用して削除できるためです。
RE:編集
文字列を「」で囲む必要はなく、文字ベクトルを作成するために「、」を入れる必要もありません。この小さなトリックが便利だと思います。
x <- unlist(strsplit(
'A
B
C
D
E',"\n"))
から http://www.statmethods.net/management/subset.html
# exclude variables v1, v2, v3
myvars <- names(mydata) %in% c("v1", "v2", "v3")
newdata <- mydata[!myvars]
# exclude 3rd and 5th variable
newdata <- mydata[c(-3,-5)]
# delete variables v3 and v5
mydata$v3 <- mydata$v5 <- NULL
「含まれない」のリストを作るのは本当に賢いと思った
setdiff
関数を使用できます:
削除するよりも保持する列が多い場合:delete 2列、たとえばdata.frame DTのcol1、col2を使用するとします。次のことができます。
DT<-DT[,setdiff(names(DT),c("col1","col2"))]
保持する列よりも削除する列が多い場合:keep col1とcol2のみにしたい場合:
DT<-DT[,c("col1","col2")]
編集に対処するだけです。
@nzcoopsでは、コンマ区切りの文字ベクトル内の列名needを使用しません。あなたはこれについて間違った方法で考えています。するとき
_vec <- c("col1", "col2", "col3")
_
あなたは作成文字ベクトルです。 _,
_は、そのベクトルを定義するときにc()
関数がとる引数を分離するだけです。 names()
および同様の関数return名前の文字ベクトル。
_> dat <- data.frame(col1 = 1:3, col2 = 1:3, col3 = 1:3)
> dat
col1 col2 col3
1 1 1 1
2 2 2 2
3 3 3 3
> names(dat)
[1] "col1" "col2" "col3"
_
names(dat)
の要素から選択する方が、カットアンドペーストできるコンマ区切りの文字列に出力を処理するよりもはるかに簡単で、エラーが少なくなります。
カラム_col1
_および_col2
_、サブセットnames(dat)
が必要で、必要なものだけを保持するとします。
_> names(dat)[c(1,3)]
[1] "col1" "col3"
> dat[, names(dat)[c(1,3)]]
col1 col3
1 1 1
2 2 2
3 3 3
_
やりたいことができますが、Rは常にベクトルを引用符で画面に出力します_"
_:
_> paste('"', names(dat), '"', sep = "", collapse = ", ")
[1] "\"col1\", \"col2\", \"col3\""
> paste("'", names(dat), "'", sep = "", collapse = ", ")
[1] "'col1', 'col2', 'col3'"
_
後者の方が便利かもしれません。ただし、その文字列から切り取って貼り付ける必要があります。必要なものを返すオブジェクトを操作し、標準のサブセット化ルーチンを使用して必要なものを保持する方がはるかに優れています。
Dplyrのselect()
関数は、列のサブセット化に強力です。アプローチのリストについては、_?select_helpers
_を参照してください。
この場合、共通のプレフィックスと列名の連続番号がある場合、_num_range
_を使用できます。
_library(dplyr)
df1 <- data.frame(first = 0, col1 = 1, col2 = 2, col3 = 3, col4 = 4)
df1 %>%
select(num_range("col", c(1, 4)))
#> col1 col4
#> 1 1 4
_
より一般的には、select()
でマイナス記号を使用して、次のように列を削除できます。
_mtcars %>%
select(-mpg, -wt)
_
最後に、「列名の実用的なベクトルを作成する簡単な方法はありますか?」 -はい、名前のリストを手動で編集する必要がある場合は、dput
を使用して、カンマ区切りの引用符付きリストを簡単に操作できます。
_dput(names(mtcars))
#> c("mpg", "cyl", "disp", "hp", "drat", "wt", "qsec", "vs", "am",
#> "gear", "carb")
_
すでにいくつかの方法で作成できる名前のベクトルがある場合は、サブセット関数を使用して簡単にオブジェクトを保持または削除できます。
dat2 <- subset(dat, select = names(dat) %in% c(KEEP))
この場合、KEEPは事前に作成された列名のベクトルです。例えば:
#sample data via Brandon Bertelsen
df <- data.frame(a=rnorm(100),
b=rnorm(100),
c=rnorm(100),
d=rnorm(100),
e=rnorm(100),
f=rnorm(100),
g=rnorm(100))
#creating the initial vector of names
df1 <- as.matrix(as.character(names(df)))
#retaining only the name values you want to keep
KEEP <- as.vector(df1[c(1:3,5,6),])
#subsetting the intial dataset with the object KEEP
df3 <- subset(df, select = names(df) %in% c(KEEP))
結果:
> head(df)
a b c d
1 1.05526388 0.6316023 -0.04230455 -0.1486299
2 -0.52584236 0.5596705 2.26831758 0.3871873
3 1.88565261 0.9727644 0.99708383 1.8495017
4 -0.58942525 -0.3874654 0.48173439 1.4137227
5 -0.03898588 -1.5297600 0.85594964 0.7353428
6 1.58860643 -1.6878690 0.79997390 1.1935813
e f g
1 -1.42751190 0.09842343 -0.01543444
2 -0.62431091 -0.33265572 -0.15539472
3 1.15130591 0.37556903 -1.46640276
4 -1.28886526 -0.50547059 -2.20156926
5 -0.03915009 -1.38281923 0.60811360
6 -1.68024349 -1.18317733 0.42014397
> head(df3)
a b c e
1 1.05526388 0.6316023 -0.04230455 -1.42751190
2 -0.52584236 0.5596705 2.26831758 -0.62431091
3 1.88565261 0.9727644 0.99708383 1.15130591
4 -0.58942525 -0.3874654 0.48173439 -1.28886526
5 -0.03898588 -1.5297600 0.85594964 -0.03915009
6 1.58860643 -1.6878690 0.79997390 -1.68024349
f
1 0.09842343
2 -0.33265572
3 0.37556903
4 -0.50547059
5 -1.38281923
6 -1.18317733