我在使用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.frame df,我希望这里的每一行df都是重复的lengthTime次数,并且添加了一个新的列,从1开始lengthTime计算每行df.
我知道,这听起来很复杂,但我基本上要为申请expand.grid到df.这是一个丑陋的解决方法,我觉得有一个更简单的解决方案(甚至可能是一个base-R函数?):
df <- data.frame(ID = rep(letters[1:3], each=3),
CatA = rep(1:3, times = 3),
CatB = letters[1:9])
lengthTime <- 3
nrRow <- nrow(df)
intDF <- df
for (i in 1:(lengthTime - 1)) {
df <- rbind(df, intDF)
}
df$Time <- rep(1:lengthTime, each=nrRow)
Run Code Online (Sandbox Code Playgroud)
我以为我可以使用expand.grid(df, 1:lengthTime),但这不起作用.outer也没带任何运气.那么有谁知道一个好的解决方案?
我基本上想要改变包的不可见功能.对于可见函数,即在methods调用它们时没有星号的函数,我发现两个帖子如何实现我的目标:
assignInNamespace:请参阅R-help上的帖子.fix:请参阅stackoverflow上的帖子虽然这两种方法都适用于导出/可见功能(我predict.lm在下面进一步使用第二种方法并使用该功能测试第一种方法subset.data.frame),但它们不适用于不可见的功能,例如predict.ar.这是为什么?有解决方法吗?
这是一个最小的例子:
显示predict.lm是可见的,predict.ar不是:
methods(predict)
[1] predict.Arima* predict.HoltWinters* predict.StructTS*
[4] predict.ar* predict.arima0* predict.glm
[7] predict.lm predict.loess* predict.mlm
[10] predict.nls* predict.poly predict.ppr*
[13] predict.prcomp* predict.princomp* predict.smooth.spline*
[16] predict.smooth.spline.fit*
Run Code Online (Sandbox Code Playgroud)
申请predict.lm:
x <- rnorm(5)
y <- x + rnorm(5)
predict(lm(y ~ x))
# 1 2 3 4 5
# 1.0783047 1.5288031 0.3268405 0.8373520 -0.9833746
Run Code Online (Sandbox Code Playgroud)
更改predict.lm输入的猫在函数体的开头("第一线改变predict.lm \n").(您必须在编辑器中手动执行此操作):
fix(predict.lm)
predict(lm(y ~ x))
# …Run Code Online (Sandbox Code Playgroud) 我有一个data.table,DT其中包含一个名为RF列的列,其中包含许多带有下划线的列_.我想循环遍历带有下划线的所有列,并RF从中减去列.但是,我被卡住了.似乎:=运算符的RHS中的所有内容
data.table都不适用于动态变量.
这是我DT和所需的输出(硬编码):
library(data.table)
DT <- data.table(RF = 1:10,
S_1 = 11:20,
S_2 = 21:30)
#Desired output
DT[ , S_1 := S_1 - RF]
DT[ , S_2 := S_2 - RF]
DT
RF S_1 S_2
[1,] 1 10 20
[2,] 2 10 20
[3,] 3 10 20
...
Run Code Online (Sandbox Code Playgroud)
但是,我希望它更灵活,即在其名称中使用"_"循环遍历每一列并减去RF:
#1. try: Does not work; Interestingly, the i on the LHS of := is interpreted as …Run Code Online (Sandbox Code Playgroud) 在测试我的代码时,我发现了以下内容:如果我将data.table分配DT1给DT并在DT之后进行DT1更改,则使用它进行更改.所以DT,DT1似乎是内部联系的.这是预期的行为吗?虽然我不是编程专家,但这对我来说是错误的,并且用简单的R变量或a来测试它data.frame,我无法重现这种行为.这里发生了什么事?
DF <- data.frame(ID=letters[1:5],
value=1:5)
DF1 <- DF
all.equal(DF1, DF)
[1] TRUE
DF[1, "value"] <- DF[1, "value"]*2
all.equal(DF1, DF)
[1] "Component 2: Mean relative difference: 1"
library(data.table)
data.table 1.7.1 For help type: help("data.table")
DT <- data.table(ID=letters[1:5],
value=1:5)
DT1 <- DT
all.equal(DT1, DT)
[1] TRUE
DT[, value:=value*2]
ID value
[1,] a 2
[2,] b 4
[3,] c 6
[4,] d 8
[5,] e 10
all.equal(DT1, DT)
[1] …Run Code Online (Sandbox Code Playgroud) 我有一个月度数据data.table和另一个年度数据data.table,现在我想将年度数据与月度数据中的相应观察值相匹配.
我的方法如下:复制每个月的年度数据,然后加入月度和年度数据.现在我有一个关于行重复的问题.我知道怎么做,但我不确定这是不是最好的方法,所以有些意见会很棒.
以下是data.table DT我的年度数据的示例以及我目前的复制方式:
library(data.table)
DT <- data.table(ID = paste(rep(c("a", "b"), each=3), c(1:3, 1:3), sep="_"),
values = 10:15,
startMonth = seq(from=1, by=2, length=6),
endMonth = seq(from=3, by=3, length=6))
DT
ID values startMonth endMonth
[1,] a_1 10 1 3
[2,] a_2 11 3 6
[3,] a_3 12 5 9
[4,] b_1 13 7 12
[5,] b_2 14 9 15
[6,] b_3 15 11 18
#1. Alternative
DT1 <- DT[, list(MONTH=startMonth:endMonth), by="ID"]
setkey(DT, ID)
setkey(DT1, ID) …Run Code Online (Sandbox Code Playgroud) 我在lubridate包中偶然发现了一个奇怪的行为:dmy(NA)拖出一个错误,而不仅仅是返回一个NA.当我想转换一个包含一些元素为NA的列和一些通常转换没有问题的日期字符串时,这会导致我出现问题.
这是最小的例子:
library(lubridate)
df <- data.frame(ID=letters[1:5],
Datum=c("01.01.1990", NA, "11.01.1990", NA, "01.02.1990"))
df_copy <- df
#Question 1: Why does dmy(NA) not return NA, but throws an error?
df$Datum <- dmy(df$Datum)
Error in function (..., sep = " ", collapse = NULL) : invalid separator
df <- df_copy
#Question 2: What's a work around?
#1. Idea: Only convert those elements that are not NAs
#RHS works, but assigning that to the LHS doesn't work (Most likely problem::
#column …Run Code Online (Sandbox Code Playgroud) 我有data.table两列:一ID列和一value列.我想通过分裂表ID列,并运行一个函数foo在value列.只要foo不返回NA,这样就可以正常工作.在那种情况下,我收到一个错误,告诉我组的类型不一致.我的假设是 - 因为is.logical(NA)equals TRUE和is.numeric(NA)equals FALSE,data.table内部假设我想将逻辑值与数字值组合并返回错误.但是,我发现这种行为很特殊.对此有何评论?我是否会错过这里显而易见的事情或者确实是预期的行为?如果是这样,简短的解释就会很棒.(请注意,我确实知道一个解决方法:让我们foo2返回一个完全不可能的数字并在以后过滤.但是,这看起来很糟糕).
这是一个例子:
library(data.table)
foo1 <- function(x) {if (mean(x) < 5) {return(1)} else {return(2)}}
foo2 <- function(x) {if (mean(x) < 5) {return(1)} else {return(NA)}}
DT <- data.table(ID=rep(c("A", "B"), each=5), value=1:10)
DT[, foo1(value), by=ID] #Works perfectly
ID V1
[1,] A 1
[2,] B 2
DT[, foo2(value), by=ID] #Throws error
Error in `[.data.table`(DT, , foo2(value), …Run Code Online (Sandbox Code Playgroud) 我最近发现了data.table包,现在想知道我是否应该替换我的一些plyr代码.总而言之,我真的很喜欢普利尔,我基本上实现了我想要的一切.但是,我的代码运行了一段时间,加快速度的前景足以让我进行一些测试.那些测试很快就结束了,这就是原因.
我经常使用plyr做的是将数据拆分为包含日期的列并进行一些计算:
library(plyr)
DF <- data.frame(Date=rep(c(Sys.time(), Sys.time() + 60), each=6), y=c(rnorm(6, 1), rnorm(6, -1)))
#Split up data and apply arbitrary function
ddply(DF, .(Date), function(df){mean(df$y) - df[nrow(df), "y"]})
Run Code Online (Sandbox Code Playgroud)
但是,使用具有日期格式的列似乎在data.table中不起作用:
library(data.table)
DT <- data.table(Date=rep(c(Sys.time(), Sys.time() + 60), each=6), y=c(rnorm(6, 1), rnorm(6, -1)))
setkey(DT, Date)
#Error in setkey(DT, Date) : Column 'Date' cannot be auto converted to integer without losing information.
Run Code Online (Sandbox Code Playgroud)
如果我正确理解了包,那么当我使用setkey()时,我只能获得大幅提升.另外,我认为在Date和数字之间不断转换不是很好的编码.所以我错过了一些东西,还是没有简单的方法来实现data.table?
sessionInfo()
R version 2.13.1 (2011-07-08)
Platform: x86_64-pc-mingw32/x64 (64-bit)
locale:
[1] C
attached base packages:
[1] grid stats graphics grDevices utils datasets …Run Code Online (Sandbox Code Playgroud) 我有一个函数,它接受一个Date对象并返回一个.但是,当我使用mapply函数将函数应用于data.frame列时,我遇到了问题:我没有像预期的那样得到Date-objects,而是数字.知道如何将它们转换为Date对象吗?另外,我会对这里发生的事情感兴趣.非常感谢帮助!
最小的例子:
#Define simple function that takes a date-object and returns a date-object
add_day <- function(dat) {return(dat + 1)}
#Set up data.frame with two date-object entries in one column
df <- data.frame(Col_A = c(as.Date("01/01/00", "%m/%d/%y"), as.Date("05/02/11", "%m/%d/%y")))
#That is the desired result: give a date-object to the function, get one back
add_day(df[1, "Col_A"]) #Returns [1] "2000-01-02"
add_day(df[2, "Col_A"]) #Returns [1] "2011-05-03"
#Why does it not work here? What do I get back?
mapply(add_day, df[, "Col_A"]) #Returns [1] 10958 15097; Why? …Run Code Online (Sandbox Code Playgroud)