在data.frame(或data.table)中,我想用最近的非NA值"填充"NA.一个简单的例子,使用向量(而不是a data.frame)如下:
> y <- c(NA, 2, 2, NA, NA, 3, NA, 4, NA, NA)
Run Code Online (Sandbox Code Playgroud)
我想要一个fill.NAs()允许我构造的函数yy:
> yy
[1] NA NA NA 2 2 2 2 3 3 3 4 4
Run Code Online (Sandbox Code Playgroud)
我需要对许多(总计~1 Tb)小尺寸data.frames(~30-50 Mb)重复此操作,其中一行是NA,其所有条目都是.解决问题的好方法是什么?
我做的丑陋的解决方案使用这个功能:
last <- function (x){
x[length(x)]
}
fill.NAs <- function(isNA){
if (isNA[1] == 1) {
isNA[1:max({which(isNA==0)[1]-1},1)] <- 0 # first is NAs
# can't be forward filled
}
isNA.neg <- isNA.pos <- isNA.diff <- diff(isNA)
isNA.pos[isNA.diff < 0] <- …Run Code Online (Sandbox Code Playgroud) 我需要找到行数最小的(+60)
相对较大data.frame(~250,000 x 3)(或者我可以等效地工作xts).
set.seed(1000)
my.df <- sample(1:5, 250000*3, replace=TRUE)
dim(my.df) <- c(250000,3)
my.df <- as.data.frame(my.df)
names(my.df) <- c("A", "B", "C")
Run Code Online (Sandbox Code Playgroud)
数据框my.df看起来像这样
> head(my.df)
A B C
1 2 5 2
2 4 5 5
3 1 5 3
4 4 4 3
5 3 5 5
6 1 5 3
Run Code Online (Sandbox Code Playgroud)
我试过了
require(data.table)
my.dt <- as.data.table(my.df)
my.dt[, row.min:=0] # without this: "Attempt to add new column(s) and set subset of rows at the same …Run Code Online (Sandbox Code Playgroud) 我有一个关于data.table"非连接"成语的问题,灵感来自Iterator的问题.这是一个例子:
library(data.table)
dt1 <- data.table(A1=letters[1:10], B1=sample(1:5,10, replace=TRUE))
dt2 <- data.table(A2=letters[c(1:5, 11:15)], B2=sample(1:5,10, replace=TRUE))
setkey(dt1, A1)
setkey(dt2, A2)
Run Code Online (Sandbox Code Playgroud)
这data.table看起来像这样
> dt1 > dt2
A1 B1 A2 B2
[1,] a 1 [1,] a 2
[2,] b 4 [2,] b 5
[3,] c 2 [3,] c 2
[4,] d 5 [4,] d 1
[5,] e 1 [5,] e 1
[6,] f 2 [6,] k 5
[7,] g 3 [7,] l 2
[8,] h 3 [8,] …Run Code Online (Sandbox Code Playgroud) 为什么if-else结构和函数ifelse()的行为不同?
mylist <- list(list(a=1, b=2), list(x=10, y=20))
l1 <- ifelse(sum(sapply(mylist, class) != "list")==0, mylist, list(mylist))
l2 <-
if(sum(sapply(mylist, class) != "list") == 0){ # T: all list elements are lists
mylist
} else {
list(mylist)
}
all.equal(l1,l2)
# [1] "Length mismatch: comparison on first 1 components"
Run Code Online (Sandbox Code Playgroud) 我试图了解如何使用该包mmap
访问大型csv文件.更准确地说,我想
mmap用csv文件创建一个对象mmap.csv();mmap.csv()包含二进制格式的数据创建的文件;mmap().实现1.和2.很简单:只需使用mmap.cv()并保存tempfile()
包含二进制数据的内容,或修改mmap.cv()为接受额外参数作为输出文件(并相应地修改行tmpstruct <- tempfile()).我遇到的麻烦是3.特别是,我需要为来自mmap对象的二进制数据中的记录构造一个C-struct .这是一个简单的可重现的例子:
# create mmap object with its file
library(mmap)
data(cars)
m <- as.mmap(cars, file="cars.Rmap")
colnames(m) <- colnames(cars)
str(m)
munmap(m)
Run Code Online (Sandbox Code Playgroud)
来自的信息str()可用于构造record.struct允许cars.Rmap
通过函数mmap 映射二进制文件的C结构
.
> str(m)
<mmap:temp.Rmap> (struct) struct [1:50, 1:2] 4 ...
data :<externalptr>
bytes : num 400
filedesc : Named int 27
- attr(*, "names")= chr …Run Code Online (Sandbox Code Playgroud) 在我的机器上,sqldf将POSIXct从本地时间(我在CST,GMT -0600)更改为GMT/UTC.这是预期的行为吗?我可以阻止R或sqldf这样做吗?这是我的代码:
> library('sqldf')
>
> before <- data.frame(ct_sys = Sys.time())
> before
ct_sys
1 2012-03-01 12:57:58
> after <- sqldf('select * from before')
> after
ct_sys
1 2012-03-01 18:57:58
>
Run Code Online (Sandbox Code Playgroud) 请考虑以下列中的列选择data.table:
library(data.table) # using 1.8.7 from r-forge
dt <- data.table(a = 1:5, b = i <- rnorm(5), c = pnorm(i))
dt[, list(a,b)] #ok
Run Code Online (Sandbox Code Playgroud)
为了在具有许多和可变列的某些计算中简化我的代码,我想list(a,b)用函数替换.这是第一次尝试:
.ab <- function() quote(list(a, b))
dt[, eval(.ab())] #ok - same as above
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想摆脱eval()来自[.data.table呼叫,它限制在定义.ab的同时避免将数据表,而dt该函数.ab.
.eab <- function() eval(quote(list(a, b)))
dt[, .eab()]
# Error in eval(expr, envir, enclos) : object 'b' not found
Run Code Online (Sandbox Code Playgroud)
发生了什么?怎么解决这个问题?
我怀疑是什么让我感到愤怒的是R的词汇范围以及正确的评估list(a,b)依赖于它在数据表的J环境中dt.唉,我不知道如何获取对正确环境的引用,并将其用作envir或enclos …
加载.csv时sqldf,一切都很顺利,直到我加载data.table.例如:
library(sqldf)
write.table(trees, file="trees.csv", row.names=FALSE, col.names=FALSE, sep=",")
my.df <- read.csv.sql("trees.csv", "select * from file",
header = FALSE, row.names = FALSE)
Run Code Online (Sandbox Code Playgroud)
工作,而
library(data.table)
my.df <- read.csv.sql("trees.csv", "select * from file",
header = FALSE, row.names = FALSE)
# Error in list(...)[[1]] : subscript out of bounds
Run Code Online (Sandbox Code Playgroud)
不.加载后,data.table通知您
The following object(s) are masked from 'package:base':
cbind, rbind
Run Code Online (Sandbox Code Playgroud)
所以,我试过这个
rbind <- base::rbind # `unmask` rbind from base::
library(data.table)
my.df <- read.csv.sql("trees.csv", "select * from file",
header …Run Code Online (Sandbox Code Playgroud) 在这个问题data.table中讨论了在s 中使用日期的问题.解决方案是使用内置类来表示时间和日期.这些工作精度高达秒.在索引列中是否有处理毫秒的解决方法?
练习包括通过因子的组合和R中的data.table来聚合值的数值向量.以下面的数据表为例:
require (data.table)
require (plyr)
dtb <- data.table (cbind (expand.grid (month = rep (month.abb[1:3], each = 3),
fac = letters[1:3]),
value = rnorm (27)))
Run Code Online (Sandbox Code Playgroud)
请注意,'month'和'fac'的每个独特组合都会出现三次.因此,当我尝试通过这两个因素平均值时,我应该期望一个包含9个唯一行的数据框:
(agg1 <- ddply (dtb, c ("month", "fac"), function (dfr) mean (dfr$value)))
month fac V1
1 Jan a -0.36030953
2 Jan b -0.58444588
3 Jan c -0.15472876
4 Feb a -0.05674483
5 Feb b 0.26415972
6 Feb c -1.62346772
7 Mar a 0.24560510
8 Mar b 0.82548140
9 Mar c 0.18721114
Run Code Online (Sandbox Code Playgroud)
但是,当与data.table聚合时,我会不断得到两个因素的每个冗余组合提供的结果:
(agg2 <- dtb[, value …Run Code Online (Sandbox Code Playgroud) 有一种简单的方法可以使用RSQLite并且sqldf有超过999个变量吗?
这个问题也在这里提出.关于R-sig-DB的答案
"这不起作用的原因似乎是sqlite源码中的SQLITE_MAX_VARIABLE_NUMBER(在RSQLite中)目前设置为999."
以下是一些示例代码:
# works fine
widedf <- rnorm(2*998)
dim(widedf) <- c(2, 998)
f2 <- tempfile()
write.csv(widedf, f2, quote = FALSE)
f2 <- file(f2)
widedf <- sqldf("select * from f2",
dbname = tempfile(),
file.format = list(header = T, row.names = F))
# doesn't work
widedf <- rnorm(2*1000)
dim(widedf) <- c(2, 1000)
f1 <- tempfile()
write.csv(widedf, f1, quote = FALSE)
f1 <- file(f1)
widedf <- sqldf("select * from f1",
dbname = tempfile(),
file.format = …Run Code Online (Sandbox Code Playgroud) 以下代码无缝执行
wave = HaarWavelet[];
type = "PrimalLowpass";
h = WaveletFilterCoefficients[
wave, type,
WorkingPrecision -> \[Infinity]
];
h = Flatten[
Take[h,
Range[1, Length[h]],
Table[2, {Length[h]}]
]
]
Run Code Online (Sandbox Code Playgroud)
但是当它包裹在一起时Module会出错.考虑这个功能
getWaveletFilter[wave_, type_]:=
Module[{filter}, (* treated as local *)
filter = WaveletFilterCoefficients[
wave, type, WorkingPrecision -> \[Infinity]
]
filter = Flatten[
Take[filter,
Range[1, Length[filter]],
Table[2, {Length[filter]}]
]
]
filter
]
Run Code Online (Sandbox Code Playgroud)
我想getWaveletFilter[HaarWavelet[], "PrimalHighpass"]
回来
{1/2, -1/2}
Run Code Online (Sandbox Code Playgroud)
相反,Mathematica有各种各样的抱怨.有什么建议吗?