我在使用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 not have the option stringsAsFactors?
dt[, "ID", with=FALSE] <- as.character(dt[, "ID", with=FALSE])
#Produces error: Error in `[<-.data.table`(`*tmp*`, , "ID", with = FALSE, value = "c(1, 1, 1, 1, 1, 2, …Run Code Online (Sandbox Code Playgroud) 我有一个data.table,我希望在某些列上执行相同的操作.这些列的名称以字符向量给出.在这个特定的例子中,我想将所有这些列乘以-1.
一些玩具数据和指定相关列的向量:
library(data.table)
dt <- data.table(a = 1:3, b = 1:3, d = 1:3)
cols <- c("a", "b")
Run Code Online (Sandbox Code Playgroud)
现在我这样做,循环遍历字符向量:
for (col in 1:length(cols)) {
dt[ , eval(parse(text = paste0(cols[col], ":=-1*", cols[col])))]
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在没有for循环的情况下直接执行此操作?
我想将data.table cols的子集转换为新类.这里有一个流行的问题(在data.table中转换列类)但是答案创建了一个新对象,而不是在starter对象上运行.
举个例子:
dat <- data.frame(ID=c(rep("A", 5), rep("B",5)), Quarter=c(1:5, 1:5), value=rnorm(10))
cols <- c('ID', 'Quarter')
Run Code Online (Sandbox Code Playgroud)
如何最好地将cols列转换为(例如)一个因子?在普通的data.frame中,你可以这样做:
dat[, cols] <- lapply(dat[, cols], factor)
Run Code Online (Sandbox Code Playgroud)
但这对data.table不起作用,也不适用
dat[, .SD := lapply(.SD, factor), .SDcols = cols]
Run Code Online (Sandbox Code Playgroud)
来自Matt Dowle(2013年12月)的链接问题中的评论表明以下情况很好,但看起来不那么优雅.
for (j in cols) set(dat, j = j, value = factor(dat[[j]]))
Run Code Online (Sandbox Code Playgroud)
目前是否有更好的data.table答案(即更短+不生成计数器变量),或者我应该只使用上面的+ rm(j)?
我想将data.table中的一组列修改为因子.如果我事先知道列的名称,我认为这将是直截了当的.
library(data.table)
dt1 <- data.table(a = (1:4), b = rep(c('a','b')), c = rep(c(0,1)))
dt1[,class(b)]
dt1[,b:=factor(b)]
dt1[,class(b)]
Run Code Online (Sandbox Code Playgroud)
但我没有,而是有一个变量名列表
vars.factors <- c('b','c')
Run Code Online (Sandbox Code Playgroud)
我可以毫无问题地将因子函数应用于它们......
lapply(vars.factors, function(x) dt1[,class(get(x))])
lapply(vars.factors, function(x) dt1[,factor(get(x))])
lapply(vars.factors, function(x) dt1[,factor(get(x))])
Run Code Online (Sandbox Code Playgroud)
但我不知道如何重新分配或更新数据表中的原始列.
这失败了......
lapply(vars.factors, function(x) dt1[,x:=factor(get(x))])
# Error in get(x) : invalid first argument
Run Code Online (Sandbox Code Playgroud)
就像这样......
lapply(vars.factors, function(x) dt1[,get(x):=factor(get(x))])
# Error in get(x) : object 'b' not found
Run Code Online (Sandbox Code Playgroud)
NB.我试着在这里提出的答案没有任何运气.
我有一个矩阵,有很多行,只有两个成对的列.我想计算第1列中每行之间的差异,如果差异小于预定义值(.001),则计算两列中这些行的平均值.例如,我有一个称为权重的矩阵,
A B
185.0765 10
185.3171 20
186.0777 30
186.0780 40
188.0078 50
weights<-as.data.table(weights)
bins<-weights[A %between% c(A[3],(A[3]+.001))]
meanA<-mean(bins$A)
meanB<-mean(bins$B)
Run Code Online (Sandbox Code Playgroud)
并且得到的矩阵将是,
A B
185.0765 10
185.3171 20
186.0779 35
188.0078 50
Run Code Online (Sandbox Code Playgroud)
如果有人可以建议我如何为大量行做这件事,我将感激不尽.我认为使用for循环不会非常有效.
我正在使用 data.table 我有一个新列的名称向量。我想创建这些新列,但使用旧列中的信息。让我在下面的例子中展示它:
data <- data.table(a = c("OneA", "TwoB", "ThreeC"),
b = c(1, 2, 3))
newCols <- c("One", "Two", "Three")
for (newCol in newCols) {
data[, eval(newCol) := gsub(paste0("^.*", newCol), "", a)]
}
Run Code Online (Sandbox Code Playgroud)
作为输出,我期望(并得到)以下内容:
> data
a b One Two Three
1: OneA 1 A OneA OneA
2: TwoB 2 TwoB B TwoB
3: ThreeC 3 ThreeC ThreeC C
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我结合从向量定义新列并使用向量值本身来填充这些列。有没有办法做得更优化(例如使用 set())?
这个问题是关于理解,我要投资我的学习精力用于数据R.之间扯皮具体dplyr,dtplyr和data.table。我dplyr主要使用数据,但是当数据太大而无法使用时data.tabe,这种情况很少发生。因此,现在dtplyrv1.0已成为的接口data.table,从表面上看,我似乎再也不需要担心data.table再次使用该接口。
那么,目前尚不能使用的最有用的功能或方面data.table是什么dtplyr,而将来可能永远无法使用dtplyr?
从表面上看,dplyr借助的好处,data.table它听起来像dtplyr会超越dplyr。会不会有任何理由来使用dplyr,一旦dtplyr已经完全成熟?
注意:我不是在问dplyrvs data.table(就像在data.table vs dplyr中:一个人可以做得很好而另一个不能做得不好或做得不好吗?),但是鉴于在一个特定问题上一个人比另一个人更受青睐,为什么呢?牛逼dtplyr是使用工具。