小编Ste*_*pré的帖子

使用dplyr每n分钟进行一次分组

我有一个数据集,其中包含在给定日期的特定时间发生的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)

r xts dplyr

15
推荐指数
3
解决办法
4189
查看次数

根据特定值过滤data.frame的每一列

请考虑以下数据框:

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)

r dplyr

14
推荐指数
3
解决办法
2707
查看次数

使用来自tidyr的聚集时保留属性(属性不相同)

我有一个数据框,需要分成两个表来满足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)

r tidyr

12
推荐指数
1
解决办法
1万
查看次数

cSplit库(splitstackshape)总是丢弃列

我正在寻找一种通过分隔符拆分列内容并将表转换为长格式的方法.我cSplitsplitstackshape包中发现它几乎正在寻找我正在寻找的东西.

问题现在有了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)

r splitstackshape

8
推荐指数
1
解决办法
4399
查看次数

将数据帧转换为treeNetwork兼容列表

请考虑以下数据框:

   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)

r networkd3

8
推荐指数
1
解决办法
850
查看次数

R:使用stringdist和stringdistmatrix生成近似匹配列表

我发现了优秀的包"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 …

string r matrix stringdist

8
推荐指数
2
解决办法
6439
查看次数

使用R将单个柱分成多个观察

我正在研究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)

这种方法会导致内存问题.有没有更好的方法来解决这个问题?

一些评论:

  • 除"T"之外,数据有许多字母.
  • 这封信可以在前面或最后但不在两个数字之间.
  • 在一个范围内,"T"到"U"的字母没有变化

r medical data.table data-cleaning splitstackshape

8
推荐指数
2
解决办法
1055
查看次数

match()与%运算符中的%

从我读到的 ?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)

r match

6
推荐指数
1
解决办法
1623
查看次数

R - seek中的模糊融合有助于提高我的代码

受到statar包中的实验fuzzy_join函数的启发,我自己编写了一个函数,它结合了精确和模糊(通过字符串距离)匹配.我必须做的合并工作非常大(导致多个字符串距离矩阵,小于10亿个单元格),我的印象是函数编写效率不高(关于内存使用情况)和并行化以奇怪的方式实现(字符串距离矩阵的计算,如果存在多个模糊变量,而不是字符串距离本身的计算并行化).至于功能,想法是在可能的情况下匹配精确变量(以保持矩阵更小),然后在这个精确匹配的组内进行模糊匹配.我实际上认为这个功能是不言自明的.我在这里发布它是因为我希望得到一些反馈来改进它,因为我想我并不是唯一一个尝试在R中做类似事情的人(虽然我承认Python,SQL和类似的东西可能在这种情况下要更有效率.但是必须坚持一个人感觉最舒服的事情,并且使用相同的语言进行数据清理和准备在再现性方面是很好的) fuzzy_joinfuzzy_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

6
推荐指数
0
解决办法
580
查看次数

如何减少R"两个"类型图中线和点之间的填充

我试图在R中绘制一系列点,我type="b"用作绘图选项.然而,在点和它们之间的线之间存在大量填充(空白空间),以至于线在某些点之间完全消失.她的照片看起来像是:

消失线条的例子

我试图通过cex绘图选项使点更小,但这没有帮助,因为它只改变点的大小而不是这些点之间的点之间的线开始和结束的位置.我不知道这是否有所作为,但我使用的符号是pch=1.

我有兴趣知道是否可以减少这种填充,以及你如何做到这一点.我对使用type=o情节选项不感兴趣.

plot r

6
推荐指数
2
解决办法
739
查看次数