我有一个数据框.我们叫他bob
:
> head(bob)
phenotype exclusion
GSM399350 3- 4- 8- 25- 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-
GSM399351 3- 4- 8- 25- 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-
GSM399352 3- 4- 8- 25- 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-
GSM399353 3- 4- 8- 25+ 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-
GSM399354 3- 4- 8- 25+ 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-
GSM399355 3- 4- 8- 25+ 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-
Run Code Online (Sandbox Code Playgroud)
我想连接这个数据框的行(这将是另一个问题).但看: …
我最近看到马特Dowle写一些代码as.factor()
,特别是
for (col in names_factors) set(dt, j=col, value=as.factor(dt[[col]]))
Run Code Online (Sandbox Code Playgroud)
我使用了这个片段,但是我需要明确设置因子级别以确保级别以我想要的顺序出现,所以我不得不改变
as.factor(dt[[col]])
Run Code Online (Sandbox Code Playgroud)
至
factor(dt[[col]], levels = my_levels)
Run Code Online (Sandbox Code Playgroud)
这让我想到:什么(如果有的话)是使用as.factor()
与仅仅的好处factor()
?
我试图通过应用共享函数找出一种优雅的方法来使用:=
赋值来一次替换多列data.table
.这种情况的典型用法可能是将字符串函数(例如gsub
)应用于表中的所有字符列.将data.frame
这样做的方式扩展到a 并不困难data.table
,但我正在寻找一种与data.table
做事方式一致的方法.
例如:
library(data.table)
m <- matrix(runif(10000), nrow = 100)
df <- df1 <- df2 <- df3 <- as.data.frame(m)
dt <- as.data.table(df)
head(names(df))
head(names(dt))
## replace V20-V100 with sqrt
# data.frame approach
# by column numbers
df1[20:100] <- lapply(df1[20:100], sqrt)
# by reference to column numbers
v <- 20:100
df2[v] <- lapply(df2[v], sqrt)
# by reference to column names
n <- paste0("V", 20:100)
df3[n] <- lapply(df3[n], sqrt)
# …
Run Code Online (Sandbox Code Playgroud) 我想将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语法的新手,我正在努力学习.我现在的问题是基本的,但它会帮助我更好地理解数据表的思维方式!
这里问了一个类似的问题!但是,该解决方案似乎与重新分类一列或所有列有关.我的问题对于少数几列来说是独一无二的.
### Load package
require(data.table)
### Create pseudo data
data <- data.table(id = 1:10,
height = rnorm(10, mean = 182, sd = 20),
weight = rnorm(10, mean = 160, sd = 10),
color = rep(c('blue', 'gold'), times = 5))
### Reclass all columns
data <- data[, lapply(.SD, as.character)]
### Search for columns to be reclassed
index <- grep('(id)|(height)|(weight)', names(data))
### data frame method
df <- data.frame(data)
df[, index] <- lapply(df[, index], as.numeric)
### Failed attempt to …
Run Code Online (Sandbox Code Playgroud) 我想将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.我试着在这里提出的答案没有任何运气.
在以下示例中,有人可以向我解释为什么2015-03-31的日期更改为1034-04-03?
dt1 = data.table(id = c(1,2), date = as.POSIXct("2015-03-31 BST"), key = "id")
dt1
# id date
# 1: 1 2015-03-31
# 2: 2 2015-03-31
dt2 = data.table(id = c(1,2), date = as.Date(NA), key = "id")
dt2
# id date
# 1: 1 <NA>
# 2: 2 <NA>
dt2[dt1, date := i.date]
dt2
# id date
# 1: 1 1034-04-03
# 2: 2 1034-04-03
Run Code Online (Sandbox Code Playgroud)
我的目的是让date
来自dt1
于dt2
在Date
格式,而不是POSIXct
由id
(不同id
会有不同date …
如何让do.call(namespace:base)和rbindlist(namespace:data.table)表现相同.rbindlist消除了因子水平,而do.call则没有.以下显示了该问题
(dataList <- list(data.frame(f1=rep(c("a"), each=1),"c"=rnorm(2),"d"=rnorm(2)),
data.frame(f1=rep(c("b"), each=1),"c"=rnorm(2),"d"=rnorm(2))) )
(rbindlist.Data <- rbindlist(dataList)) # combines lists into ONE data.frame same as above
(do.call.Data <- do.call(rbind, dataList))
Run Code Online (Sandbox Code Playgroud)