Questions tagged «data.table»

R data.table包是data.frame的扩展,用于快速内存数据分析。将dt标记用于带有Shiny(DT)的DataTables包。

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])。因此,我希望了解键的作用,以便在数据表中正确设置键。 我读过的一个资料是 ?setkey。 setkey() 排序一个 data.table并将其标记为已排序。排序的列是关键。键可以是任何顺序的任何列。列始终按升序排序。该表通过引用进行了更改。除了临时的工作存储区(最大为一列)外,根本不进行任何复制。 我在这里的要点是,一个键会“排序” data.table,从而产生与 order()。但是,它没有解释拥有钥匙的目的。 data.table常见问题解答3.2和3.3说明: 3.2我没有大桌子上的钥匙,但是分组仍然非常快。这是为什么? data.table使用基数排序。这比其他排序算法快得多。基数仅用于整数,请参见 ?base::sort.list(x,method="radix")。这也是为什么setkey()快速的原因之一 。如果未设置任何键,或者我们按与键不同的顺序进行分组,则称其为临时。 3.3为什么键中的按列分组比临时按分组更快? 由于每个组在RAM中是连续的,因此可以最大程度地减少页获取,并且可以批量复制内存(memcpy在C中),而不是在C中循环。 从这里开始,我猜想通过设置密钥可以使R在其他算法上使用“基数排序”,这就是为什么它更快的原因。 10分钟快速入门指南还提供了按键指南。 按键 让我们从考虑data.frame开始,特别是行名(或者用英语,行名)。即,多个名称属于单个行。属于单行的多个名称?那不是我们在data.frame中所习惯的。我们知道每一行最多只有一个名称。一个人至少有两个名字,第一个名字和第二个名字。例如,这对于组织电话目录很有用,该电话目录按姓氏,然后按姓氏排序。但是,data.frame中的每一行只能有一个名称。 键由一行或多列行名组成,这些行名可以是整数,因子,字符或其他某些类,而不仅仅是字符。此外,行按键排序。因此,一个data.table最多可以具有一个键,因为它不能以一种以上的方式进行排序。 不强制唯一性,即允许重复的键值。由于行是按键排序的,因此键中的所有重复项将连续出现 电话簿有助于理解键是什么,但与具有factor列相比,键似乎没有什么不同。此外,它没有解释为什么需要一个键(尤其是使用某些功能)以及如何选择要设置为键的列。另外,似乎在以时间为列的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")) 以下情况仅适用于一种情况: 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)") …

6
按组获取最高值
这是一个示例数据框: d <- data.frame( x = runif(90), grp = gl(3, 30) ) 我想要d包含的行的子集,每个行的的前5个值都x为grp。 使用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
dplyr在data.table上,我真的在使用data.table吗?
如果我使用dplyr语法上的顶部数据表中,同时仍然使用dplyr的语法我能得到的所有数据表的速度益处?换句话说,如果我使用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
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)]行不通的(我也没想到)。
91 r  data.table 


5
在data.table列中拆分文本字符串
我有一个脚本,可将CSV文件中的数据读入a data.table,然后将一列中的文本拆分为几个新列。我目前正在使用lapply和strsplit函数来执行此操作。这是一个例子: 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 …
86 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循环?
85 r  data.table 

12
dplyr更改/替换行子集上的几列
我正在尝试一个基于dplyr的工作流(而不是主要使用data.table,我曾经使用过),但是遇到了一个问题,我找不到与之等效的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 several …
85 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
在R data.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创建数据帧的副本,这意味着我需要可用内存至少为数据大小的两倍。有没有复制的方法吗? 这是一个简单的示例来演示: 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
过滤出data.table中的重复/非唯一行
编辑2019: 在2016年11月进行更改之前,曾问过这个问题data.table,有关当前方法和以前的方法,请参见下面可接受的答案。 我有一个data.table约250万行的表。有两列。我想删除在两列中都重复的任何行。以前对于data.frame我会这样做: df -> unique(df[,c('V1', 'V2')])但这对data.table不起作用。我已经尝试过,unique(df[,c(V1,V2), with=FALSE])但是它似乎仍然只对data.table的键进行操作,而不是对整个行进行操作。 有什么建议么? 欢呼声,戴维 例 >dt V1 V2 [1,] A B [2,] A C [3,] A D [4,] A B [5,] B A [6,] C D [7,] C D [8,] E F [9,] G G [10,] A B 在上面的data.table中,其中V2的表键是,仅删除行4,7和10。 > dput(dt) structure(list(V1 = c("B", …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.