在R中,我有一个操作,Inf当我转换数据帧时会创建一些值.
我想将这些Inf值转换为NA值.我的代码对于大数据来说速度慢,有没有更快的方法呢?
说我有以下数据帧:
dat <- data.frame(a=c(1, Inf), b=c(Inf, 3), d=c("a","b"))
Run Code Online (Sandbox Code Playgroud)
以下适用于单个案例:
dat[,1][is.infinite(dat[,1])] = NA
Run Code Online (Sandbox Code Playgroud)
所以我用以下循环推广它
cf_DFinf2NA <- function(x)
{
for (i in 1:ncol(x)){
x[,i][is.infinite(x[,i])] = NA
}
return(x)
}
Run Code Online (Sandbox Code Playgroud)
但我不认为这是真正使用R的力量.
我想在字符串中找到一个字符的位置.
说: string = "the2quickbrownfoxeswere2tired"
我希望函数返回4和24- 2s 的字符位置string.
我想我正在使用plyr错误.有人可以告诉我这是否是"高效"的plyr代码?
require(plyr)
plyr <- function(dd) ddply(dd, .(price), summarise, ss=sum(volume))
Run Code Online (Sandbox Code Playgroud)
一点背景:我有一些大的聚合问题,我注意到他们每个人都花了一些时间.在尝试解决问题时,我开始对R中各种聚合过程的性能感兴趣.
我测试了一些聚合方法 - 并且发现自己整天都在等待.
当我最终得到结果时,我发现了plyr方法和其他方法之间的巨大差距 - 这让我觉得我做错了.
我运行了以下代码(我以为我在查看时会查看新的数据帧包):
require(plyr)
require(data.table)
require(dataframe)
require(rbenchmark)
require(xts)
plyr <- function(dd) ddply(dd, .(price), summarise, ss=sum(volume))
t.apply <- function(dd) unlist(tapply(dd$volume, dd$price, sum))
t.apply.x <- function(dd) unlist(tapply(dd[,2], dd[,1], sum))
l.apply <- function(dd) unlist(lapply(split(dd$volume, dd$price), sum))
l.apply.x <- function(dd) unlist(lapply(split(dd[,2], dd[,1]), sum))
b.y <- function(dd) unlist(by(dd$volume, dd$price, sum))
b.y.x <- function(dd) unlist(by(dd[,2], dd[,1], sum))
agg <- function(dd) aggregate(dd$volume, list(dd$price), sum)
agg.x <- function(dd) aggregate(dd[,2], list(dd[,1]), sum)
dtd <- function(dd) …Run Code Online (Sandbox Code Playgroud) 我希望找到矩阵的最大元素值及其位置(矩阵中的行和列id).
我使用以下函数返回矩阵的行和列.
这似乎是一个糟糕的黑客 - 这是我可能错过本机方法的事情.是否有更好/ 更多的R方式?
这是我的功能:
matxMax <- function(mtx)
{
colmn <- which(mtx == max(mtx)) %/% nrow(mtx) + 1
row <- which(mtx == max(mtx)) %% nrow(mtx)
return( matrix(c(row, colmn), 1))
}
Run Code Online (Sandbox Code Playgroud)
我用的如下:
mm <- matrix(rnorm(100), 10, 10)
maxCords <- matxMax(mm)
mm[maxCords]
Run Code Online (Sandbox Code Playgroud) 我有一个列表,并希望将列表的元素分解为全局环境中的单独对象.
例如,我想要列表:
obj <- list(a=1:5, b=2:10, c=-5:5)
Run Code Online (Sandbox Code Playgroud)
是三个单独的对象a,b和c.
我尝试用以下方法实现这一点:
lapply(obj, FUN = function(x) names(x)[1] <<- x[1])
Run Code Online (Sandbox Code Playgroud)
但它失败了Error in names(x)[1] <<- x[1] : object 'x' not found.
我怎样才能实现目标?
我想有一个中缀操作%between%中R-检查,看是否x是下限之间l和上限u.
我创建了以下简单函数 - 但它不是中缀操作.
# between function - check to see if x is between l and u
is.between <- function(x, l, u) { x > l & x < u }
Run Code Online (Sandbox Code Playgroud)
我的目标是用以下代替: x %between% c(l, u)
是否可以定义新的中缀操作?如果是这样,那怎么做呢?
提前致谢
我是vim的新用户(在Windows中使用gvim),并且发现缩写节省了很多时间 - 但是如果我能够有时停止尾随空格,它们会更好.
我有一些我经常使用的目录,所以我在我的_vimrc中添加了一些缩写/路径对:
:ab diR1 C:/dirA/dira/dir1/
:ab diR2 C:/dirA/dirb/dir2/
Run Code Online (Sandbox Code Playgroud)
等......
现在,当我输入时,diR1 <space>我得到C:/dirA/dira/dir1/[]|了空格所代表的位置[],而光标就是|字符.我想摆脱[]==空白.
这是一个小小的抱怨:但是你似乎能够在Vim中定制其他内容,所以我想我会问 - 当在vim中使用缩写时是否可以避免尾随空格?
在Vim中使用的另一个工具是一个很好的答案 - 我的目标是保存重新键入常用的目录结构,但是让光标很方便,因为我几乎总是会添加一些东西到底,例如myFile.txt.
space在添加myFile.txt到结尾之前我退回的尾随空白区域(无疑由于触发缩写的事实而言)比反复输入整个东西更不烦人,但如果我能避免这样做,那将是理想的. .
像大多数人一样,Hadley Wickham和他所做的事情给我留下了深刻的印象R- 所以我想我会把一些功能转移到他tidyverse身上......这样做我不知道这一切的意义是什么?
我的新dplyr功能比它们的基本等效速度慢得多 - 我希望我做错了什么.我特别喜欢从理解所需的努力中得到一些回报non-standard-evaluation.
那么,我做错了什么?为什么dplyr这么慢?
一个例子:
require(microbenchmark)
require(dplyr)
df <- tibble(
a = 1:10,
b = c(1:5, 4:0),
c = 10:1)
addSpread_base <- function() {
df[['spread']] <- df[['a']] - df[['b']]
df
}
addSpread_dplyr <- function() df %>% mutate(spread := a - b)
all.equal(addSpread_base(), addSpread_dplyr())
microbenchmark(addSpread_base(), addSpread_dplyr(), times = 1e4)
Run Code Online (Sandbox Code Playgroud)
时间结果:
Unit: microseconds
expr min lq mean median uq max neval
addSpread_base() 12.058 15.769 22.07805 24.58 26.435 …Run Code Online (Sandbox Code Playgroud) 我在R中运行滚动回归,使用存储在a中的数据data.table.
我有一个工作版本,但它感觉就像一个黑客 - 我真的使用我从zoo包中知道的,没有任何魔法data.table...因此,它感觉比它应该慢.
结合约书亚的建议 - 下面 - 通过使用lm.fit而不是使用约12倍的加速lm.
(修订版)示例代码:
require(zoo)
require(data.table)
require(rbenchmark)
set.seed(1)
tt <- seq(as.Date("2011-01-01"), as.Date("2012-01-01"), by="day")
px <- rnorm(366, 95, 1)
DT <- data.table(period=tt, pvec=px)
dtt <- DT[,tnum:=as.numeric(period)][, list(pvec, tnum)]
dtx <- as.matrix(DT[,tnum:=as.numeric(period)][, tnum2:= tnum^2][, int:=1][, list(pvec, int, tnum, tnum2)])
rollreg <- function(dd) coef(lm(pvec ~ tnum + I(tnum^2), data=as.data.frame(dd)))
rollreg.fit <- function(dd) coef(lm.fit(y=dd[,1], x=dd[,-1]))
rr <- function(dd) rollapplyr(dd, width=20, FUN = rollreg, by.column=FALSE)
rr.fit <- …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种grep方法来获取第一个空格之前的字符串中的字符.
我已经破解了以下功能,因为我无法弄清楚如何使用grep类型命令来执行此操作R.
有人可以帮助grep解决方案 - 如果有的话......
beforeSpace <- function(inWords) {
vapply(inWords, function(L) strsplit(L, "[[:space:]]")[[1]][1], FUN.VALUE = 'character')
}
words <- c("the quick", "brown dogs were", "lazier than quick foxes")
beforeSpace(words)
R> the quick brown dogs were lazier than quick foxes
"the" "brown" "lazier"
Run Code Online (Sandbox Code Playgroud)
并且让我知道是否有比grep(或我的功能beforeSpace)更好的方法来做到这一点.
r ×9
data.table ×3
dataframe ×2
dplyr ×1
environments ×1
grep ×1
matrix ×1
performance ×1
plyr ×1
regex ×1
string ×1
substring ×1
vim ×1
zoo ×1