我有一个数据集,其中包含在给定日期的特定时间发生的10个事件,每个事件都有相应的值:
d1 <- data.frame(date = as.POSIXct(c("21/05/2010 19:59:37", "21/05/2010 08:40:30",
"21/05/2010 09:21:00", "21/05/2010 22:29:50", "21/05/2010 11:27:34",
"21/05/2010 18:25:14", "21/05/2010 15:16:01", "21/05/2010 09:41:53",
"21/05/2010 15:01:29", "21/05/2010 09:02:06"), format ="%d/%m/%Y %H:%M:%S"),
value = c(11313,42423,64645,643426,1313313,1313,3535,6476,11313,9875))
Run Code Online (Sandbox Code Playgroud)
我想以标准数据帧格式(从"21/05/2010 00:00:00"到"21/05/2010 23:57:00")每3分钟汇总一次结果,以便数据框有480个分档每个3分钟)
首先,我创建一个包含每个3分钟的分区的数据框:
d2 <- data.frame(date = seq(as.POSIXct("2010-05-21 00:00:00"),
by="3 min", length.out=(1440/3)))
Run Code Online (Sandbox Code Playgroud)
然后,我将两个数据帧合并在一起并删除NA:
library(dplyr)
m <- merge(d1, d2, all=TRUE) %>% mutate(value = ifelse(is.na(value),0,value))
Run Code Online (Sandbox Code Playgroud)
最后,我用period.apply()
从xts
包值相加每个箱:
library(xts)
a <- period.apply(m$value, endpoints(m$date, "minutes", 3), sum)
Run Code Online (Sandbox Code Playgroud)
有没有更有效的方法来做到这一点?它感觉不太理想.
更新#1
在Joshua回答之后我调整了我的代码:
library(xts)
startpoints <- function (x, on = "months", k …
Run Code Online (Sandbox Code Playgroud) 请考虑以下数据框:
df <- data.frame(replicate(5,sample(1:10,10,rep=TRUE)))
# X1 X2 X3 X4 X5
#1 7 9 8 4 10
#2 2 4 9 4 9
#3 2 7 8 8 6
#4 8 9 6 6 4
#5 5 2 1 4 6
#6 8 2 2 1 7
#7 3 8 6 1 6
#8 3 8 5 9 8
#9 6 2 3 10 7
#10 2 7 4 2 9
Run Code Online (Sandbox Code Playgroud)
dplyr
对于大于2的所有值,使用,如何对每列进行过滤(不隐式命名).
一种模仿假设的东西 filter_each(funs(. >= 2))
现在我正在做:
df %>% filter(X1 …
Run Code Online (Sandbox Code Playgroud) 我有一个数据框,需要分成两个表来满足Codd的第三范式.在一个简单的例子中,原始数据框看起来像这样:
library(lubridate)
> (df <- data.frame(hh_id = 1:2,
income = c(55000, 94000),
bday_01 = ymd(c(20150309, 19890211)),
bday_02 = ymd(c(19850911, 20000815)),
gender_01 = factor(c("M", "F")),
gender_02 = factor(c("F", "F"))))
hh_id income bday_01 bday_02 gender_01 gender_02
1 1 55000 2015-03-09 1985-09-11 M F
2 2 94000 1989-02-11 2000-08-15 F F
Run Code Online (Sandbox Code Playgroud)
当我使用聚集函数时,它会警告属性不相同,并且会丢失性别因素和bday的润滑(或实际示例中的其他属性).是否有一个很好的tidyr解决方案,以避免丢失每列的数据类型?
library(tidyr)
> (person <- df %>%
select(hh_id, bday_01:gender_02) %>%
gather(key, value, -hh_id) %>%
separate(key, c("key", "per_num"), sep = "_") %>%
spread(key, value))
hh_id per_num bday gender
1 1 01 1425859200 M …
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种通过分隔符拆分列内容并将表转换为长格式的方法.我cSplit
从splitstackshape
包中发现它几乎正在寻找我正在寻找的东西.
问题现在有了drop
选项.我希望我的分割列能够以某种方式复制,但这不会发生.我做错了吗?有人遇到过这个问题吗?
我不确定我是否做错了什么,但该drop = FALSE
选项在我的情况下不起作用.
这是一个例子:
library(splitstackshape)
jnk <- data.table(a = '1,2,3,4,5', b = 5)
jnk
# a b
# 1: 1,2,3,4,5 5
cSplit(jnk, 'a', ',', 'long', drop = FALSE)
# a b
# 1: 1 5
# 2: 2 5
# 3: 3 5
# 4: 4 5
# 5: 5 5
Run Code Online (Sandbox Code Playgroud)
我的期望是这样的:
cSplit(jnk, 'a', ',', 'long', drop = FALSE)
# a b a.orig
# 1: 1 5 1,2,3,4,5
# 2: …
Run Code Online (Sandbox Code Playgroud) 请考虑以下数据框:
Country Provinces City Zone
1 Canada Newfondland St Johns A
2 Canada PEI Charlottetown B
3 Canada Nova Scotia Halifax C
4 Canada New Brunswick Fredericton D
5 Canada Quebec NA NA
6 Canada Quebec Quebec City NA
7 Canada Ontario Toronto A
8 Canada Ontario Ottawa B
9 Canada Manitoba Winnipeg C
10 Canada Saskatchewan Regina D
Run Code Online (Sandbox Code Playgroud)
是否有一种聪明的方法将其转换为treeNetwork
兼容列表(从networkD3
包中),形式如下:
CanadaPC <- list(name = "Canada",
children = list(
list(name = "Newfoundland",
children = list(list(name = "St. …
Run Code Online (Sandbox Code Playgroud) 我发现了优秀的包"stringdist",现在想用它来计算字符串距离.特别是我有一组单词,我想打印近似匹配,其中"近匹配"是通过一些算法,如Levenshtein距离.
我在shell脚本中的工作代码非常慢,我能够在stringdist中加载并生成带有指标的矩阵.现在我想将该矩阵归结为只有近似匹配的较小矩阵,例如,度量值非零但小于某个阈值.
kp <- c('leaflet','leafletr','lego','levenshtein-distance','logo')
kpm <- stringdistmatrix(kp,useNames="strings",method="lv")
> kpm
leaflet leafletr lego levenshtein-distance
leafletr 1
lego 5 6
levenshtein-distance 16 16 18
logo 6 7 1 19
m = as.matrix(kpm)
close = apply(m, 1, function(x) x>0 & x<5)
> close
leaflet leafletr lego levenshtein-distance logo
leaflet FALSE TRUE FALSE FALSE FALSE
leafletr TRUE FALSE FALSE FALSE FALSE
lego FALSE FALSE FALSE FALSE TRUE
levenshtein-distance FALSE FALSE FALSE FALSE FALSE
logo FALSE FALSE TRUE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)
好的,现在我有一个(大)dist,如何将它减少回一个输出类似的列表
leafletr,leaflet,1
logo,lego,1
Run Code Online (Sandbox Code Playgroud)
仅适用于度量标准为非零且小于n …
我正在研究HCUP数据,它在一个列中有一系列值,需要拆分成多列.以下是HCUP数据框供参考:
code label
61000-61003 excision of CNS
0169T-0169T ventricular shunt
Run Code Online (Sandbox Code Playgroud)
期望的输出应该是:
code label
61000 excision of CNS
61001 excision of CNS
61002 excision of CNS
61003 excision of CNS
0169T ventricular shunt
Run Code Online (Sandbox Code Playgroud)
我解决这个问题的方法是使用包splitstackshape并使用此代码
library(data.table)
library(splitstackshape)
cSplit(hcup, "code", "-")[, list(code = code_1:code_2, by = label)]
Run Code Online (Sandbox Code Playgroud)
这种方法会导致内存问题.有没有更好的方法来解决这个问题?
一些评论:
从我读到的 ?match()
"%in%"< - function(x,table)match(x,table,nomatch = 0)> 0
为什么我会使用不同的结果 match(x, dict[["word"]], 0L)
vapply(strsplit(df$text, " "),
function(x) sum(dict[["score"]][match(x, dict[["word"]], 0L)]), 1)
#[1] 2 -2 3 -2
Run Code Online (Sandbox Code Playgroud)
与使用时相比 dict[["word"]] %in% x
vapply(strsplit(df$text, " "),
function(x) sum(dict[["score"]][dict[["word"]] %in% x]), 1)
#[1] 2 -2 1 -1
Run Code Online (Sandbox Code Playgroud)
数据
library(dplyr)
df <- data_frame(text = c("I love pandas", "I hate monkeys",
"pandas pandas pandas", "monkeys monkeys"))
dict <- data_frame(word = c("love", "hate", "pandas", "monkeys"),
score = c(1,-1,1,-1))
Run Code Online (Sandbox Code Playgroud)
更新
理查德的解释之后,我现在理解了我最初的误解.的%in%
操作者返回一个逻辑向量:
> sapply(strsplit(df$text, " "), function(x) dict[["word"]] …
Run Code Online (Sandbox Code Playgroud) 受到statar包中的实验fuzzy_join
函数的启发,我自己编写了一个函数,它结合了精确和模糊(通过字符串距离)匹配.我必须做的合并工作非常大(导致多个字符串距离矩阵,小于10亿个单元格),我的印象是函数编写效率不高(关于内存使用情况)和并行化以奇怪的方式实现(字符串距离矩阵的计算,如果存在多个模糊变量,而不是字符串距离本身的计算并行化).至于功能,想法是在可能的情况下匹配精确变量(以保持矩阵更小),然后在这个精确匹配的组内进行模糊匹配.我实际上认为这个功能是不言自明的.我在这里发布它是因为我希望得到一些反馈来改进它,因为我想我并不是唯一一个尝试在R中做类似事情的人(虽然我承认Python,SQL和类似的东西可能在这种情况下要更有效率.但是必须坚持一个人感觉最舒服的事情,并且使用相同的语言进行数据清理和准备在再现性方面是很好的) fuzzy_join
fuzzy_join
merge.fuzzy = function(a,b,.exact,.fuzzy,.weights,.method,.ncores) {
require(stringdist)
require(matrixStats)
require(parallel)
if (length(.fuzzy)!=length(.weights)) {
stop(paste0("fuzzy and weigths must have the same length"))
}
if (!any(class(a)=="data.table")) {
stop(paste0("'a' must be of class data.table"))
}
if (!any(class(b)=="data.table")) {
stop(paste0("'b' must be of class data.table"))
}
#convert everything to lower
a[,c(.fuzzy):=lapply(.SD,tolower),.SDcols=.fuzzy]
b[,c(.fuzzy):=lapply(.SD,tolower),.SDcols=.fuzzy]
a[,c(.exact):=lapply(.SD,tolower),.SDcols=.exact]
b[,c(.exact):=lapply(.SD,tolower),.SDcols=.exact]
#create ids
a[,"id.a":=as.numeric(.I),by=c(.exact,.fuzzy)]
b[,"id.b":=as.numeric(.I),by=c(.exact,.fuzzy)]
c <- unique(rbind(a[,.exact,with=FALSE],b[,.exact,with=FALSE]))
c[,"exa.id":=.GRP,by=.exact]
a <- merge(a,c,by=.exact,all=FALSE)
b <- merge(b,c,by=.exact,all=FALSE)
##############
stringdi <- function(a,b,.weights,.by,.method,.ncores) {
sdm <- list()
if (is.null(.weights)) {.weights <- …
Run Code Online (Sandbox Code Playgroud) parallel-processing r fuzzy-comparison data.table stringdist
我试图在R中绘制一系列点,我type="b"
用作绘图选项.然而,在点和它们之间的线之间存在大量填充(空白空间),以至于线在某些点之间完全消失.她的照片看起来像是:
我试图通过cex
绘图选项使点更小,但这没有帮助,因为它只改变点的大小而不是这些点之间的点之间的线开始和结束的位置.我不知道这是否有所作为,但我使用的符号是pch=1
.
我有兴趣知道是否可以减少这种填充,以及你如何做到这一点.我对使用type=o
情节选项不感兴趣.