在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) 我刚刚开始使用R并遇到一个奇怪的行为:当在空数据框中插入第一行时,原始列名称会丢失.
例:
a<-data.frame(one = numeric(0), two = numeric(0))
a
#[1] one two
#<0 rows> (or 0-length row.names)
names(a)
#[1] "one" "two"
a<-rbind(a, c(5,6))
a
# X5 X6
#1 5 6
names(a)
#[1] "X5" "X6"
Run Code Online (Sandbox Code Playgroud)
如您所见,列名1和2被X5和X6替换.
有人可以告诉我为什么会这样,并且有没有正确的方法来做到这一点而不会丢失列名?
霰弹枪解决方案是将名称保存在辅助矢量中,然后在完成数据帧处理后将其添加回来.
谢谢
语境:
我创建了一个函数,它收集一些数据并将它们作为新行添加到作为参数接收的数据帧中.我创建数据框,遍历我的数据源,将data.frame传递给每个函数调用以填充其结果.
我有一堆包含列表的列表(广义线性模型输出).我想编写一个函数,它将从每个列表中提取几个元素,然后将结果合并到一个数据框中.
我想提取modelset[[1]]$likelihood&modelset[[1]]$fixef,modelset[[2]]$likelihood&modelset[[2]]$fixef等,并将结果合并到一个数据框中.
有人能告诉我如何做到这一点吗?
如果我的问题令人困惑,请道歉:我想要做的是超出我有限的编程理解.
关于我的清单的更多信息:
modelset: Large list (16 elements, 7.3Mb)
:List of 29
..$ fixef : Named num [1:2] -1.236 -0.611
.. ..- attr(*, "names")= chr [1:2] "(Intercept)" "SMIstd"
..$ likelihood :List of 4
.. ..$ hlik: num 238
.. ..$ pvh : num 256
.. ..$ pbvh: num 260
.. ..$ cAIC: num 567
...etc
Run Code Online (Sandbox Code Playgroud) 说我有第一个test.csv看起来像这样
,a,b,c,d,e
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用read.csv它,它工作正常.
read.csv("test.csv",header=FALSE)
# V1 V2 V3 V4 V5 V6
#1 NA a b c d e
#Warning message:
#In read.table(file = file, header = header, sep = sep, quote = quote, :
# incomplete final line found by readTableHeader on 'test.csv'
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试使用读取此文件,则会fread收到错误.
require(data.table)
fread("test.csv",header=FALSE)
#Error in fread("test.csv", header = FALSE) :
# Not positioned correctly after testing format of header row. ch=','
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况,我该怎么做才能纠正这个问题?
假设您有以下数据集:
trt <- ifelse(runif(100)<0.5,"drug","placebo")
inj.site <- ifelse(runif(100)<0.5,"ankle","wrist")
relief <- 20 + 0.5*(inj.site=="ankle") + 0.5*(trt=="drug") + rnorm(100)
to.analyze <- data.frame(trt,inj.site,relief)
Run Code Online (Sandbox Code Playgroud)
现在,我们的想法是在x轴上制作一个带有损伤部位的箱线图,并通过并排处理制作盒子:
bplot <- ggplot(to.analyze,aes(inj.site,relief,fill=trt)) + geom_boxplot(position="dodge")
Run Code Online (Sandbox Code Playgroud)
很容易.但现在我想在盒子顶部添加原始数据点.如果我没有盒子position="dodge",这很容易:
bplot + geom_point(aes(colour=trt))
Run Code Online (Sandbox Code Playgroud)
但是,这会在框之间绘制点,并且添加position="dodge"到此几何图形似乎不起作用.如何调整此值以便在框上绘制点?
奖励:使用stat_summary(blah,y.fun=mean,shape="+")过度绘制手段的情况相同,具有相同的问题.
我觉得我的基本问题是如何在一个系列中回归多个系列.虽然我的系列时间不相等,但即使我使用相同的时间长度系列进行库存和基准测试(我可以根据需要提供我手动相等的数据),我收到错误.我想估计一个市场模型(即,对于所有股票,每天对基准回报的股票回报进行回归),并以长格式从回归中得出β值的数据框.因此,对于提供的样本,β值数据框中将有4个beta值(ABC为2,XYZ为2).这是两个股票价格的样本
idf <- structure(list(Firm = c("ABC", "ABC", "ABC", "ABC", "ABC", "ABC", "ABC",
"ABC", "ABC", "ABC", "ABC", "ABC", "ABC", "ABC", "ABC", "XYZ", "XYZ", "XYZ",
"XYZ", "XYZ", "XYZ", "XYZ", "XYZ", "XYZ", "XYZ", "XYZ", "XYZ", "XYZ", "XYZ",
"XYZ"), Date = structure(c(NA, 1451642400, 1451646000, 1451649600, 1451653200,
1451656800, 1451660400, 1451664000, 1451898000, 1451901600, 1451905200,
1451908800, 1451912400, 1451916000, 1451919600, NA, 1451642400, 1451646000,
1451649600, 1451653200, 1451656800, 1451660400, 1451664000, 1451898000,
1451901600, 1451905200, 1451908800, 1451912400, 1451916000, 1451919600),
tzone = "UTC", class = c("POSIXct", "POSIXt")), Price = c(1270.9, 1277,
1273.25, 1273.85, …Run Code Online (Sandbox Code Playgroud) 我正在寻找一个基于位置对字符串执行删除操作的函数.
例如,给定字符串就是这样
string1 <- "hello stackoverflow"
Run Code Online (Sandbox Code Playgroud)
假设,我想删除第4,第10和第18个职位.
首选输出
"helo stakoverflw"
Run Code Online (Sandbox Code Playgroud)
我不确定这种功能是否存在.
Name Grade
John C
John C+
John C
John B
John A
John A+
Kat B
Kat C
Kat B
Run Code Online (Sandbox Code Playgroud)
我想添加一个新列,Months从3开始,然后继续其倍数.行都是排序的.输出看起来像
Name Grade Months
John C 3
John C+ 6
John C 9
John B 12
John A 15
John A+ 18
Kat B 3
Kat C 6
Kat B 9
Run Code Online (Sandbox Code Playgroud)
RCODE
name <- df$Name[1]
count <- 0
for (i in 1:length(df[,1])){
if (name!=df$Name[i]){
count <- 0
name <- df$Name[i]
}
df$Months[i] <- count
count <- count + …Run Code Online (Sandbox Code Playgroud)