我正在使用data.table,并且有许多功能需要我设置密钥(例如X[Y]).因此,我希望了解密钥在我的数据表中正确设置密钥的作用.
我读过的一个来源是?setkey.
setkey()对adata.table进行排序并将其标记为已排序.排序列是关键.密钥可以是任何顺序的任何列.列始终按升序排序.该表通过引用更改.除了临时工作内存大到一列之外,根本不会复制.
我的理念是,一个键可以"排序"data.table,从而产生非常相似的效果order().但是,它没有解释拥有密钥的目的.
data.table FAQ 3.2和3.3解释了:
3.2我没有大桌子上的钥匙,但分组仍然非常快.这是为什么?
data.table使用基数排序.这比其他排序算法快得多.Radix仅用于整数,请参阅
?base::sort.list(x,method="radix").这也是setkey()快速的原因之一 .如果没有设置密钥,或者我们按照与密钥不同的顺序进行分组,我们称之为ad hoc.3.3为什么密钥中的列按比ad hoc更快的分组?
因为每个组在RAM中是连续的,从而最小化页面提取,并且可以批量复制内存(
memcpy在C中)而不是在C中循环.
从这里开始,我想设置一个键以某种方式允许R使用"基数排序"而不是其他算法,这就是它更快的原因.
10分钟快速入门指南还有一个按键指南.
- 按键
让我们从考虑data.frame,特别是rownames(或英文,行名)开始.也就是说,属于单行的多个名称.属于单行的多个名称?这不是我们在data.frame中习惯的.我们知道每行最多只有一个名称.一个人至少有两个名字,第一个名字和第二个名字.这对于组织电话目录很有用,例如,按姓氏排序,然后是第一个名称.但是,data.frame中的每一行只能有一个名称.
密钥由一列或多列rownames组成,可以是整数,因子,字符或其他类,而不仅仅是字符.此外,行按键排序.因此,data.table最多只能有一个键,因为它不能以多种方式排序.
不强制执行唯一性,即允许重复键值.由于行按键排序,因此键中的任何重复项都将连续出现
电话簿有助于理解密钥是什么,但与具有因子列相比,似乎密钥没有区别.此外,它没有解释为什么需要密钥(特别是使用某些功能)以及如何选择要设置为密钥的列.此外,似乎在data.table中将time作为列,将任何其他列设置为键也可能会使时间列混乱,这使得它更加混乱,因为我不知道是否允许将任何其他列设置为键.有人可以开导我吗?
如何从data.table中提取列作为向量的列?以下是我尝试过的一些代码片段:
DT<-data.table(x=c(1,2),y=c(3,4),z=c(5,6))
DT
# x y z
#1: 1 3 5
#2: 2 4 6
Run Code Online (Sandbox Code Playgroud)
我想使用列位置获取此输出
DT$y
#[1] 3 4
is.vector(DT$y)
#[1] TRUE
Run Code Online (Sandbox Code Playgroud)
使用列位置获取此输出的其他方法
DT[,y]
#[1] 3 4
is.vector(DT[,y])
#[1] TRUE
Run Code Online (Sandbox Code Playgroud)
这不会给出矢量
DT[,2,with=FALSE]
# y
#1: 3
#2: 4
is.vector(DT[,2,with=FALSE])
#[1] FALSE
Run Code Online (Sandbox Code Playgroud)
这两个不起作用:
DT$noquote(names(DT)[2]) # Doesn't work
#Error: attempt to apply non-function
DT[,noquote(names(DT)[2])] # Doesn't work
#[1] y
Run Code Online (Sandbox Code Playgroud)
这不会给出一个向量:
DT[,noquote(names(DT)[2]),with=FALSE] # Not a vector
# y
#1: 3
#2: 4
is.vector(DT[,noquote(names(DT)[2]),with=FALSE])
#[1] FALSE
Run Code Online (Sandbox Code Playgroud) 正如标题所述,我正在尝试使用gsub,其中我使用向量作为"模式"和"替换".目前,我有一个代码如下:
names(x1) <- gsub("2110027599", "Inv1", names(x1)) #x1 is a data frame
names(x1) <- gsub("2110025622", "Inv2", names(x1))
names(x1) <- gsub("2110028045", "Inv3", names(x1))
names(x1) <- gsub("2110034716", "Inv4", names(x1))
names(x1) <- gsub("2110069349", "Inv5", names(x1))
names(x1) <- gsub("2110023264", "Inv6", names(x1))
Run Code Online (Sandbox Code Playgroud)
我希望做的是这样的事情:
a <- c("2110027599","2110025622","2110028045","2110034716", "2110069349", "2110023264")
b <- c("Inv1","Inv2","Inv3","Inv4","Inv5","Inv6")
names(x1) <- gsub(a,b,names(x1))
Run Code Online (Sandbox Code Playgroud)
我猜测某个地方有一个应用功能可以做到这一点,但我不太确定使用哪一个!
编辑:名称(x1)看起来像这样(有更多的列,但我把它们排除在外):
> names(x1)
[1] "2110023264A.Ms.Amp" "2110023264A.Ms.Vol" "2110023264A.Ms.Watt" "2110023264A1.Ms.Amp"
[5] "2110023264A2.Ms.Amp" "2110023264A3.Ms.Amp" "2110023264A4.Ms.Amp" "2110023264A5.Ms.Amp"
[9] "2110023264B.Ms.Amp" "2110023264B.Ms.Vol" "2110023264B.Ms.Watt" "2110023264B1.Ms.Amp"
[13] "2110023264Error" "2110023264E-Total" "2110023264GridMs.Hz" "2110023264GridMs.PhV.phsA"
[17] "2110023264GridMs.PhV.phsB" "2110023264GridMs.PhV.phsC" "2110023264GridMs.TotPFPrc" "2110023264Inv.TmpLimStt"
[21] "2110023264InvCtl.Stt" "2110023264Mode" …Run Code Online (Sandbox Code Playgroud) 我希望在LaTeX文档中插入R代码块.listings包的默认设置也会更改字体,但不会更改我需要的颜色.
虽然我知道我可以使用该lstset功能设置颜色,但我不太确定看起来不错的组合.因此,任何人都可以共享他们lstset的listings包的设置颜色R语法?这样看到这篇文章的每个人都可以使用相同的设置!
我有一个看起来像这样的数据框
date_time loc_id node energy kgco2
1 2009-02-27 00:11:08 87 103 0.00000 0.00000
2 2009-02-27 01:05:05 87 103 7.00000 3.75900
3 2009-02-27 02:05:05 87 103 6.40039 3.43701
4 2009-02-27 03:05:05 87 103 4.79883 2.57697
5 2009-02-27 04:05:05 87 103 4.10156 2.20254
6 2009-02-27 05:05:05 87 103 2.59961 1.39599
Run Code Online (Sandbox Code Playgroud)
无论如何我可以根据时间范围对其进行子集化,例如,凌晨2点到凌晨5点.然后我应该得到一个看起来像这样的结果:
date_time loc_id node energy kgco2
3 2009-02-27 02:05:05 87 103 6.40039 3.43701
4 2009-02-27 03:05:05 87 103 4.79883 2.57697
5 2009-02-27 04:05:05 87 103 4.10156 2.20254
Run Code Online (Sandbox Code Playgroud) 说我有第一个test.csv看起来像这样
,a,b,c,d,e
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用read.csv它,它工作正常.
read.csv("test.csv",header=FALSE)
# V1 V2 V3 V4 V5 V6
#1 NA a b c d e
#Warning message:
#In read.table(file = file, header = header, sep = sep, quote = quote, :
# incomplete final line found by readTableHeader on 'test.csv'
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试使用读取此文件,则会fread收到错误.
require(data.table)
fread("test.csv",header=FALSE)
#Error in fread("test.csv", header = FALSE) :
# Not positioned correctly after testing format of header row. ch=','
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况,我该怎么做才能纠正这个问题?
我正在学习使用data.table包.我要做的其中一件事是将最后一列("x")移到第一列.以下是我为数据框执行的操作:
DF <- cbind(x, DF[1:ncol(DF)]) #Rearrange columns
Run Code Online (Sandbox Code Playgroud)
我读了setcolorder并尝试了这个,但是我收到了一个错误
setcolorder(DT, c("x", 1: (length(DT)-1) ) )
Run Code Online (Sandbox Code Playgroud)
有谁知道更好的解决方案?
DT<-data.table(a=1,b=2,a=3)
DT
# a b a
#1: 1 2 3
setnames(DT,"b","c")
#Error in setnames(DT, "b", "c") :
# 'old' is character but there are duplicate column names: a
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,您可以看到我希望更改不重复的列的标题,但setnames阻止我这样做.有没有办法忽略检查,因为我正在更改的列标题不重复?
有没有办法在vim中运行我当前的python代码而不对文件进行任何更改?通常,当我想从vim中测试我的代码时,我会执行:
:w !python
Run Code Online (Sandbox Code Playgroud)
但是,这会覆盖我正在编辑的当前文件.通常,我会添加打印语句或注释内容,以查看我的代码无效的原因.我不希望这些更改覆盖我正在处理的任何.py文件的先前版本.有办法吗?也许是保存到临时文件并在之后删除它的组合?
假设我有一个数据框df
df <- data.frame( a1 = 1:10, b1 = 2:11, c2 = 3:12 )
Run Code Online (Sandbox Code Playgroud)
我希望对列进行子集化,但是使用模式
df1 <- subset( df, select= (pattern = "1") )
Run Code Online (Sandbox Code Playgroud)
要得到
> df1
a1 b1
1 1 2
2 2 3
3 3 4
4 4 5
5 5 6
6 6 7
7 7 8
8 8 9
9 9 10
10 10 11
Run Code Online (Sandbox Code Playgroud)
这可能吗?