相关疑难解决方法(0)

转换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 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)

r data.table

113
推荐指数
3
解决办法
9万
查看次数

如何将相同的函数应用于data.table中的每个指定列

我有一个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循环的情况下直接执行此操作?

r data.table

70
推荐指数
3
解决办法
4万
查看次数

在data.table中转换*some*列类

我想将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)

r data.table

22
推荐指数
1
解决办法
9654
查看次数

我可以以编程方式更新data.table中的一组列(到因子)的类型吗?

我想将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.我试着在这里提出的答案没有任何运气.

r r-factor data.table

5
推荐指数
1
解决办法
310
查看次数

大量行之间的差异

我有一个矩阵,有很多行,只有两个成对的列.我想计算第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循环不会非常有效.

r data.table

4
推荐指数
1
解决办法
470
查看次数

是否有一种最佳方法可以使用 data.table 创建一堆新列?

我正在使用 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 data.table

4
推荐指数
1
解决办法
87
查看次数

我无法在data.table中使用dtplyr做什么

这个问题是关于理解,我要投资我的学习精力用于数据R.之间扯皮具体dplyrdtplyrdata.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是使用工具。

r dplyr data.table dtplyr

3
推荐指数
3
解决办法
251
查看次数

标签 统计

data.table ×7

r ×7

dplyr ×1

dtplyr ×1

r-factor ×1