タグ付けされた質問 「data.table」

R data.tableパッケージは、高速のメモリ内データ分析のために構築されたdata.frameの拡張です。Shiny(DT)でDataTablesパッケージにdtタグを使用します。

8
data.tableの列クラスを変換する
data.tableの使用に問題があります:列クラスを変換するにはどうすればよいですか?簡単な例を次に示します。data.frameを使用すると、変換に問題はありません。data.tableを使用すると、方法がわかりません。 df <- data.frame(ID=c(rep("A", 5), rep("B",5)), Quarter=c(1:5, 1:5), value=rnorm(10)) #One way: http://stackoverflow.com/questions/2851015/r-convert-data-frame-columns-from-factors-to-characters df <- data.frame(lapply(df, as.character), stringsAsFactors=FALSE) #Another way df[, "value"] <- as.numeric(df[, "value"]) library(data.table) dt <- data.table(ID=c(rep("A", 5), rep("B",5)), Quarter=c(1:5, 1:5), value=rnorm(10)) dt <- data.table(lapply(dt, as.character), stringsAsFactors=FALSE) #Error in rep("", ncol(xi)) : invalid 'times' argument #Produces error, does data.table …
118 r  data.table 

2
data.tableにキーを設定する目的は何ですか?
私はdata.tableを使用しており、キーを設定する必要がある多くの機能があります(例:)X[Y]。そのため、データテーブルにキーを適切に設定するために、キーの機能を理解したいと考えています。 私が読んだソースの1つはでした?setkey。 setkey()a data.tableをソートし、ソート済みとしてマークします。ソートされた列がキーです。キーは、任意の順序で任意の列にすることができます。列は常に昇順でソートされます。参照により表が変更されます。1つの列ほどの一時的な作業メモリーを除いて、コピーはまったく作成されません。 ここで私が覚えているのは、キーがdata.tableを「ソート」して、と非常によく似た結果になるということorder()です。ただし、キーを持つ目的については説明していません。 data.table FAQ 3.2および3.3は次のことを説明しています。 3.2大きなテーブルにキーはありませんが、グループ化はまだ非常に高速です。何故ですか? data.tableは基数ソートを使用します。これは、他のソートアルゴリズムよりも大幅に高速です。基数は特に整数のみ?base::sort.list(x,method="radix")です。を参照してください 。これも、setkey()迅速な理由の1つ です。キーが設定されていない場合、またはキーの順序とは異なる順序でグループ化する場合は、アドホックと呼びます。 3.3なぜキーの列によるグループ化はアドホックよりも速いのですか? 各グループはRAM内で隣接しているため、ページフェッチが最小限に抑えられ、メモリはmemcpyCでループするのではなく、一括して(Cで)コピーできます。 ここから、キーを設定することで、Rが他のアルゴリズムよりも「基数ソート」を使用できるようになると思います。そのため、それがより高速です。 10分間のクイックスタートガイドには、キーに関するガイドもあります。 キー 最初に、data.frame、具体的には行名(または英語では行名)を検討します。つまり、単一の行に属する複数の名前です。1つの行に属する複数の名前?それはdata.frameで慣れていることではありません。各行の名前は最大1つであることはわかっています。人は少なくとも2つの名前、名と名を持っています。これは、電話帳を整理するのに便利です。たとえば、姓、次に名でソートされます。ただし、data.frameの各行は1つの名前しか持つことができません。 キーは、行名の1つ以上の列で構成されます。これは、単なる文字ではなく、整数、係数、文字、またはその他のクラスの場合があります。さらに、行はキーでソートされます。したがって、data.tableは複数の方法でソートできないため、最大で1つのキーを持つことができます。 一意性は強制されません。つまり、重複するキー値が許可されます。行はキーでソートされるため、キーの重複は連続して表示されます 電話帳は、キーが何であるかを理解するのに役立ちましたが、キーは、ファクター列を持っていることと比較して、違いがないようです。さらに、キーが必要な理由(特に特定の関数を使用するため)と、キーとして設定する列を選択する方法についても説明していません。また、時間を列として持つdata.tableで、他の列をキーとして設定すると、時間列も混乱する可能性があり、他の列をキー。誰かが私を啓発してくれますか?
113 r  data.table 

8
Rデータフレームからの `Inf`値のクリーニング
RではInf、データフレームを変換するときにいくつかの値を作成する操作があります。 これらのInf価値観をNA価値観に変えていきたい。私が持っているコードは大きなデータに対して遅いですが、これを行うより速い方法はありますか? 次のデータフレームがあるとします。 dat <- data.frame(a=c(1, Inf), b=c(Inf, 3), d=c("a","b")) 以下は1つのケースで機能します。 dat[,1][is.infinite(dat[,1])] = NA だから私は次のループでそれを一般化しました cf_DFinf2NA <- function(x) { for (i in 1:ncol(x)){ x[,i][is.infinite(x[,i])] = NA } return(x) } しかし、私はこれが本当にRの力を使用しているとは思いません。
101 r  dataframe  data.table 

5
Rでdata.framesをマージ/結合する最も速い方法は何ですか?
たとえば(ただし、最も代表的な例かどうかはわかりません): N <- 1e6 d1 <- data.frame(x=sample(N,N), y1=rnorm(N)) d2 <- data.frame(x=sample(N,N), y2=rnorm(N)) これは私がこれまでに得たものです: d <- merge(d1,d2) # 7.6 sec library(plyr) d <- join(d1,d2) # 2.9 sec library(data.table) dt1 <- data.table(d1, key="x") dt2 <- data.table(d2, key="x") d <- data.frame( dt1[dt2,list(x,y1,y2=dt2$y2)] ) # 4.9 sec library(sqldf) sqldf() sqldf("create index ix1 on d1(x)") …

5
変数名が文字ベクトルに格納されている場合は、data.tableを選択/割り当てます
data.table変数名が文字ベクトルに格納されている場合、aの変数をどのように参照しますか?たとえば、これは次の場合に機能しますdata.frame。 df <- data.frame(col1 = 1:3) colname <- "col1" df[colname] <- 4:6 df # col1 # 1 4 # 2 5 # 3 6 :=表記の有無にかかわらず、data.tableに対してこれと同じ操作を実行するにはどうすればよいですか?の明らかなことはdt[ , list(colname)]機能しません(私はそれを期待していませんでした)。
93 r  data.table 

6
グループごとに上位の値を取得する
これはサンプルデータフレームです。 d <- data.frame( x = runif(90), grp = gl(3, 30) ) の各値のd上位5つの値を持つ行を含むサブセットが必要です。xgrp base-Rを使用すると、私のアプローチは次のようになります。 ordered <- d[order(d$x, decreasing = TRUE), ] splits <- split(ordered, ordered$grp) heads <- lapply(splits, head) do.call(rbind, heads) ## x grp ## 1.19 0.8879631 1 ## 1.4 0.8844818 1 ## 1.12 0.8596197 1 ## 1.26 0.8481809 1 …
92 r  data.table  dplyr 

4
data.tableのdplyr、私は本当にdata.tableを使用していますか?
データテーブルの上でdplyr構文を使用する場合、dplyrの構文を使用しながら、datatableのすべての速度の利点を得ることができますか?言い換えると、dplyr構文でクエリを実行すると、データテーブルを誤用しますか?または、純粋なデータテーブル構文を使用して、そのすべての機能を活用する必要がありますか? アドバイスをよろしくお願いします。コード例: library(data.table) library(dplyr) diamondsDT <- data.table(ggplot2::diamonds) setkey(diamondsDT, cut) diamondsDT %>% filter(cut != "Fair") %>% group_by(cut) %>% summarize(AvgPrice = mean(price), MedianPrice = as.numeric(median(price)), Count = n()) %>% arrange(desc(Count)) 結果: # cut AvgPrice MedianPrice Count # 1 Ideal 3457.542 1810.0 21551 # 2 Premium 4584.258 3185.0 13791 # 3 Very Good …
91 r  data.table  dplyr 


5
data.table列のテキスト文字列を分割します
CSVファイルからにデータを読み込みdata.table、1つの列のテキストをいくつかの新しい列に分割するスクリプトがあります。私は現在、lapplyandstrsplit関数を使用してこれを行っています。次に例を示します。 library("data.table") df = data.table(PREFIX = c("A_B","A_C","A_D","B_A","B_C","B_D"), VALUE = 1:6) dt = as.data.table(df) # split PREFIX into new columns dt$PX = as.character(lapply(strsplit(as.character(dt$PREFIX), split="_"), "[", 1)) dt$PY = as.character(lapply(strsplit(as.character(dt$PREFIX), split="_"), "[", 2)) dt # PREFIX VALUE PX PY # 1: A_B 1 A B # 2: A_C 2 A C # …
87 r  data.table 

7
data.table内の指定されたすべての列に同じ関数を適用する方法
特定の列で同じ操作を実行したいdata.tableがあります。これらの列の名前は文字ベクトルで示されます。この特定の例では、これらすべての列に-1を掛けたいと思います。 いくつかのおもちゃのデータと関連する列を指定するベクトル: library(data.table) dt <- data.table(a = 1:3, b = 1:3, d = 1:3) cols <- c("a", "b") 今、私はそれをこのようにして、文字ベクトルをループしています: for (col in 1:length(cols)) { dt[ , eval(parse(text = paste0(cols[col], ":=-1*", cols[col])))] } forループなしでこれを直接行う方法はありますか?
86 r  data.table 

12
dplyrは、行のサブセットのいくつかの列を変更/置換します
私は(私が慣れているほとんどのdata.tableを使用するのではなく)dplyrベースのワークフローを試している最中ですが、同等のdplyrソリューションが見つからないという問題に遭遇しました。 。私は通常、単一の条件に基づいて複数の列を条件付きで更新/置換する必要があるシナリオに遭遇します。data.tableソリューションを使用したサンプルコードを次に示します。 library(data.table) # Create some sample data set.seed(1) dt <- data.table(site = sample(1:6, 50, replace=T), space = sample(1:4, 50, replace=T), measure = sample(c('cfl', 'led', 'linear', 'exit'), 50, replace=T), qty = round(runif(50) * 30), qty.exit = 0, delta.watts = sample(10.5:100.5, 50, replace=T), cf = runif(50)) # Replace the values of …
86 r  data.table  dplyr 

10
選択した列のテーブルのNA値を置き換える方法
NA値の置き換えに関する投稿はたくさんあります。次のテーブル/フレームのNAを次のように置き換えることができることを認識しています。 x[is.na(x)]<-0 しかし、特定の列のみに制限したい場合はどうなりますか?例を示しましょう。 まず、データセットから始めましょう。 set.seed(1234) x <- data.frame(a=sample(c(1,2,NA), 10, replace=T), b=sample(c(1,2,NA), 10, replace=T), c=sample(c(1:5,NA), 10, replace=T)) それは与える: a b c 1 1 NA 2 2 2 2 2 3 2 1 1 4 2 NA 1 5 NA 1 2 6 2 NA 5 7 1 1 4 8 1 …

8
Rdata.table計算で前の行の値を使用します
ある列の現在の値と別の列の前の値から計算されたdata.tableに新しい列を作成したいと思います。前の行にアクセスすることは可能ですか? 例えば: > DT <- data.table(A=1:5, B=1:5*10, C=1:5*100) > DT A B C 1: 1 10 100 2: 2 20 200 3: 3 30 300 4: 4 40 400 5: 5 50 500 > DT[, D := C + BPreviousRow] # What is the correct code here? 正解は > DT …
81 r  data.table 

1
コピーせずにデータフレームをdata.tableに変換します
に変換したい大きなデータフレーム(数GBのオーダー)がありdata.tableます。を使用as.data.tableすると、データフレームのコピーが作成されます。つまり、データの少なくとも2倍のサイズの使用可能なメモリが必要です。コピーなしで変換を行う方法はありますか? 簡単な例を次に示します。 library(data.table) N <- 1e6 K <- 1e2 data <- as.data.frame(rep(data.frame(rnorm(N)), K)) gc(reset=TRUE) tracemem(data) data <- as.data.table(data) gc() 出力あり: library(data.table) # data.table 1.8.10 For help type: help("data.table") N <- 1e6 K <- 1e2 data <- as.data.frame(rep(data.frame(rnorm(N)), K)) gc(reset=TRUE) # used (Mb) gc trigger (Mb) max used (Mb) # Ncells …

5
グループなしでNA値を線形補間するdata.table
グループなしでdata.tableにいくつかのNA値を入力したいと思いました。時間と距離を表すdata.tableのこの抽出を検討してください: library(data.table) df <- data.frame(time = seq(7173, 7195, 1), dist = c(31091.33, NA, 31100.00, 31103.27, NA, NA, NA, NA, 31124.98, NA,31132.81, NA, NA, NA, NA, 31154.19, NA, 31161.47, NA, NA, NA, NA, 31182.97)) DT<- data.table(df) DTのdata.tableで、NAの前と後の非NA値に応じた関数でNA値を入力する必要があります。例として、jで関数を記述して各命令を置き換える DT[2, dist := (31091.33 + (31100-31091.33) / 2)] その後 DT[5:8, dist := (31103.27 + …
18 r  data.table 

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.