我想在data.frame中识别二进制列.
例如,这个表
my.table <-read.table(text="a,b,c
0,2,0
0.25,1,1
1,0,0", header=TRUE, as.is=TRUE,sep = ",")
Run Code Online (Sandbox Code Playgroud)
会给 FALSE, FALSE, TRUE
我正在尝试修改自定义函数中的点(...).这是我的plot2函数的简化示例,它在屏幕上显示一个图type="p"(默认值)并保存一个svg type="l".当其中一个...绘图选项已在函数中时,问题就会浮现.在此示例中,"type"由多个实际参数匹配.
plot2 <-function(...){
plot(...) #visible on screen
svg("c:/temp/out.svg") #saved to file
plot(...,type="l")
dev.off()
}
#This works
plot2(1:10)
#This does not work because type is redefined
plot2(1:10, type="o")
Run Code Online (Sandbox Code Playgroud)
我试图将点list放在函数内部并修改它,但plot不接受列表作为输入.
#Does not work
plot2 <-function(...){
plot(...)
dots <<-list(...)
print(dots)
if("type" %in% names(dots)) dots$type="l"
print(dots)
svg("c:/temp/out.svg")
plot(dots)
dev.off()
}
plot2(1:10, type="o")
Error in xy.coords(x, y, xlabel, ylabel, log) :
'x' is a list, but does not have components 'x' …Run Code Online (Sandbox Code Playgroud) 我有一个大文本文件(475,000,000行).我想快速获取文件中的行数而不读取它.
fread从data.table实际行号出现相当迅速(约10秒),则进行读取整个文件之前:
fread('D:/text_file.txt',select=1,colClasses="character")
Read 7.1% of 472933221 rows #number of rows appears after 10 seconds
Run Code Online (Sandbox Code Playgroud)
有没有办法提取这个行号而不读取整个文件?对于记录,读取整个文件需要36秒.
我尝试过countLines,R.utils但需要53秒.不同之处可能是fread只有一个列可以选择而countLines会读取所有内容.
R.utils::countLines("D:/text_file.txt") #53 seconds
Run Code Online (Sandbox Code Playgroud)
我也尝试过其他Windows方法,例如:
find /v /c "" "D:\text_file.txt" #takes 1 minute 50 seconds
grep "^" D:\text_file.txt | wc -l #takes 2 minutes
Run Code Online (Sandbox Code Playgroud)
这些工作,但他们没有那么快fread.我在Windows上.
我正在尝试创建一个新列,指示前一个组中是否存在ID.这是我的数据:
data <- data.table(ID = c(1:3, c(9,2,3,4),c(5,1)),
groups = c(rep(c("a", "b", "c"), c(3, 4,2))))
ID groups
1: 1 a
2: 2 a
3: 3 a
4: 9 b
5: 2 b
6: 3 b
7: 4 b
8: 5 c
9: 1 c
Run Code Online (Sandbox Code Playgroud)
我不确定如何指定滞后组.我尝试使用shift,但它不起作用:
data[,.(ID=ID,match_lagged=ID %in% shift(ID)),by=groups]
Run Code Online (Sandbox Code Playgroud)
这是我想要的结果.
前3行不匹配,因为没有以前的组.FALSE也适用于这三行.ID = 4(在组b中)在组a中不匹配.ID = 5(在组c中)在组b中不匹配.
请注意,组c中的ID 1在组b中不匹配,因此即使它存在于组a中也应该为false.这就是为什么duplicated(data$ID)不起作用.来自组的数据必须与前一组匹配.
groups ID match_lagged
1: a 1 NA
2: a 2 NA
3: a 3 NA
4: b 9 FALSE …Run Code Online (Sandbox Code Playgroud) 我想cbind还是unnest或as.data.table部分嵌套列表.
id <- c(1,2)
A <- c("A1","A2","A3")
B <- c("B1")
AB <- list(A=A,B=B)
ABAB <- list(AB,AB)
nested_list <- list(id=id,ABAB=ABAB)
Run Code Online (Sandbox Code Playgroud)
的lengthID的相同ABAB(2在这种情况下).我不知道unlist该列表的一部分(ABAB)和cbind另一部分(id).这是我想要的结果data.table:
data.table(id=c(1,1,1,2,2,2),A=c("A1","A2","A3","A1","A2","A3"),B=rep("B1",6))
id A B
1: 1 A1 B1
2: 1 A2 B1
3: 1 A3 B1
4: 2 A1 B1
5: 2 A2 B1
6: 2 A3 B1
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用包含分组数据的na.locf包.我在这个问题上使用第一个解决方案:使用dplyr窗口函数来设置尾随值(填写NA值)zoodplyr
library(dplyr);library(zoo)
df1 <- data.frame(id=rep(c("A","B"),each=3),problem=c(1,NA,2,NA,NA,NA),ok=c(NA,3,4,5,6,NA))
df1
id problem ok
1 A 1 NA
2 A NA 3
3 A 2 4
4 B NA 5
5 B NA 6
6 B NA NA
Run Code Online (Sandbox Code Playgroud)
当在一个组内,所有数据都是NA时,就会出现问题.正如您在问题列中看到的那样na.locf,id = B 的数据来自另一个组:id = A的最后一个数据.
df1 %>% group_by(id) %>% na.locf()
Source: local data frame [6 x 3]
Groups: id [2]
id problem ok
<chr> <chr> <chr>
1 A 1 <NA>
2 A 1 3
3 A 2 4
4 …Run Code Online (Sandbox Code Playgroud) 我有一个像这样的 data.table:
DT <- data.table(id = c(rep("a", 3), rep("b", 3)),
col1 = c(NA,1,2,NA,3,NA), col2 = c(NA,NA,5,NA,NA,NA))
id col1 col2
1: a NA NA
2: a 1 NA
3: a 2 5
4: b NA NA
5: b 3 NA
6: b NA NA
Run Code Online (Sandbox Code Playgroud)
对于每个 id,我想使用 删除 'col1' 中带有前导 s 的行。这是我期待的结果:NAzoo::na.trim
id col1 col2
1: a 1 NA
2: a 2 5
3: b 3 NA
4: b NA NA
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止所尝试过的。这确实删除了NA“col1”中的前导,但它从结果中省略了“col2”:
DT[ , na.trim(col1), by = …Run Code Online (Sandbox Code Playgroud) 我正在尝试在两者之间建立滚动相关性data.table。
dt <- data.table(a=-1:10,b=1:12)\n> dt\n a b\n 1: -1 1\n 2: 0 2\n 3: 1 3\n 4: 2 4\n 5: 3 5\n 6: 4 6\n 7: 5 7\n 8: 6 8\n 9: 7 9\n10: 8 10\n11: 9 11\n12: 10 12\nRun Code Online (Sandbox Code Playgroud)\n\n这是我尝试使用rollapply的zoo:
library(zoo)\ndt[,rcor:=rollapplyr(as.list(a,b),width=5,\n FUN=function(y) {return(cor(y[[1]],y[[2]]))},fill=NA)] \n\nError in zoo(data) : \xe2\x80\x9cx\xe2\x80\x9d : attempt to define invalid zoo object\nRun Code Online (Sandbox Code Playgroud)\n\n并与roll_cor来自roll:
library(roll)\nroll_cor(dt[,.(a,b)],5) \nError in roll_cor(dt[, .(a, b)], 5) : …Run Code Online (Sandbox Code Playgroud) 我正在进行逐步回归,我想提取最终公式,以便在另一个回归中使用它.
使用此示例:
lm1 <- lm(Fertility ~ ., data = swiss)
slm1 <- step(lm1)
Run Code Online (Sandbox Code Playgroud)
我希望能够将其分配给公式对象:
Fertility ~ Agriculture + Education + Catholic +
Infant.Mortality
Run Code Online (Sandbox Code Playgroud) 我有一个嵌套列表,我想lapply as.data.frame在最深的嵌套级别,然后rbindlist(从data.table)一切.这是我的数据:
a <- list(date="2017-01-01",ret=1:5)
b <- list(date="2017-01-02",ret=7:9)
lvl3 <- list(a,b)
lvl2 <- list(lvl3,lvl3)
lvl1 <- list(lvl2,lvl2,lvl2)
Run Code Online (Sandbox Code Playgroud)
如果我只有lvl3,我会将其转换为a data.frame和rbind数据:
rbindlist(lapply(lvl3,as.data.frame))
date ret
1: 2017-01-01 1
2: 2017-01-01 2
3: 2017-01-01 3
4: 2017-01-01 4
5: 2017-01-01 5
6: 2017-01-02 7
7: 2017-01-02 8
8: 2017-01-02 9
Run Code Online (Sandbox Code Playgroud)
我将如何从lvl1和rbind所有嵌套中做到这一点data.frames?这不起作用:
rbindlist(lapply(lvl1,as.data.frame))
所需结果包含48行:
date ret
1: 2017-01-01 1
2: 2017-01-01 2
3: 2017-01-01 3
4: 2017-01-01 4
5: 2017-01-01 5
6: …Run Code Online (Sandbox Code Playgroud) 在文本中插入数学符号应该不是那么复杂我想!
OTH,甚至用数学表达式查看类似的例子 ggplot2 facet_wrap
我仍然无法插入Ω(Omega)符号geom_text!
假设您有基本的散点图,并且您希望将(Omega)数学符号的平均值添加到每个方面,
mean.Petal <- aggregate(iris["Petal.Width"], iris["Species"], mean)
Species Petal.Width
1 setosa 0.246
2 versicolor 1.326
3 virginica 2.026
ggplot(iris) +
geom_point(aes(y=Sepal.Length,x=Sepal.Width ,col=factor(Species))) +
facet_wrap(~ Species)+
geom_text(data = mean.Petal, parse = TRUE,
aes(x = 4.5, y = 7, label=sprintf('mean_Petal=%.2f %s',
round(Petal.Width,digits=2),'Omega')))
Run Code Online (Sandbox Code Playgroud)
解析时出错(text = as.character(lab)):: 1:17:意外符号1:mean_Petal = 0.25欧米茄
另一个尝试
geom_text(data = mean.Petal, parse = TRUE,
aes(x = 4.5, y = 7, label=paste('mean_Petal=',
round(Petal.Width,digits=2),expression(Omega),sep=' ')))
Run Code Online (Sandbox Code Playgroud)
解析时出错(text = as.character(lab))::: 1:18:意外符号1:mean_Petal = 0.25欧米茄
我在一列中有一些不规则的数据.
my.table <-read.table(text="ticker,date,last
a,12/20/2011,289295
a,12/21/2011,NA
a,12/27/2011,297001
a,12/28/2011,NA
b,12/20/2011,151253
b,12/21/2011,NA
b,12/27/2011,152413
b,12/28/2011,NA
b,1/4/2012,NA
d,12/21/2011,98.52
d,12/28/2011,99.36
d,1/4/2012,103.22", header=TRUE, as.is=TRUE,sep = ",")
Run Code Online (Sandbox Code Playgroud)
我通常unstack用来重塑data.frame中的数据.但是unstack不起作用,因为元素的数量不同,不能以data.frame格式.
my.expression <-last~ticker
unstacked <- unstack(my.table, my.expression ) #Not a data.frame
Run Code Online (Sandbox Code Playgroud)
我希望我的表看起来像这样:
a b c
12/20/2011 289295 151253 NA
12/21/2011 NA NA 98.52
12/27/2011 297001 152413 NA
12/28/2011 NA NA 99.36
1/4/2012 NA NA 103.22
Run Code Online (Sandbox Code Playgroud) 我有一个带有因子变量的数据框和带有几个 NA 的列,如图所示。
var col1 col2 col3
C 1 NA 1
A NA 1 1
C NA NA NA
A 1 NA 1
B NA 1 1
A 1 1 1
B 1 NA 1
B 1 1 1
C NA NA 1
B NA 1 1
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种对变量进行分组并获取每列缺失值的比例的方法,并按“var”中的级别进行分组。输出应如下所示:
var col1 col2 col3
A 0.33 0.33 0
B 0.5 0.25 0
C 0.66 1.00 0.33
Run Code Online (Sandbox Code Playgroud)
任何方法都可以,并且会赞赏不同的方法,但首选简单的 dplyr 方法。谢谢!
编辑:我正在寻找一种方法,该方法允许我一次对多个列执行此操作,并返回与我上面显示的数据框类似的数据框。
假设我的数据名为“df”,那么我想立即获取所有列的缺失比例,而不必再次手动输入名称。
以下代码不起作用,但它是我想要实现的目标的总体思路。也许一个函数可以提供帮助,但我不确定如何处理它。
df %>% group_by(var) %>% summarise(names(df[,-1]) = sum(is.na(names(df[,-1])))/n())
r ×13
data.table ×6
dplyr ×3
zoo ×3
list ×2
ggplot2 ×1
match ×1
matching ×1
math ×1
na ×1
nested-lists ×1
regression ×1
tidyverse ×1
windows ×1