小编Tho*_*ing的帖子

任何更快的方法来检查列表中的列表是否等效?

这里我有1:7四个不同分区的整数,即 {1}、{2,3,4}、{5,6} 和 {7},这些分区写在一个列表中,即list(1,c(2,3,4),c(5,6),7). 我将分区视为集合,这样一个分区内元素的不同排列应该被识别为相同的排列。例如,list(1,c(2,3,4),c(5,6),7)list(7,1,c(2,3,4),c(6,5))是等价的。

请注意,列表中的元素没有重复,例如 no list(c(1,2),c(2,1),c(1,2)),因为这个问题是在讨论整个集合上的独占分区。

我在列表中列出了一些不同的排列lst,如下所示

lst <- list(list(1,c(2,3,4),c(5,6),7),
            list(c(2,3,4),1,7,c(5,6)),
            list(1,c(2,3,4),7,c(6,5)),
            list(7,1,c(3,2,4),c(5,6)))
Run Code Online (Sandbox Code Playgroud)

我想要做的是验证所有排列都是等效的。如果是,那么我们得到 result TRUE

我所做的,到目前为止是每个分区中的元素进行排序,并使用setdiff()interset()union()判断它(见下面我的代码)

s <- Map(function(v) Map(sort,v),lst)
equivalent <- length(setdiff(Reduce(union,s),Reduce(intersect,s),))==0
Run Code Online (Sandbox Code Playgroud)

但是,我猜当分区大小增加时,这种方法会很慢。有没有更快的方法来制作它?提前欣赏!

  • 一些测试用例(小数据)
# should return `TRUE`
lst1 <- list(list(1,c(2,3,4),c(5,6)),
            list(c(2,3,4),1,c(5,6)),
            list(1,c(2,3,4),c(6,5)))

# should return `TRUE`
lst2 <- list(list(1:2, 3:4), list(3:4, 1:2))

# should return `FALSE`
lst3 <- list(list(1,c(2,3,4),c(5,6)), list(c(2,3,4),1,c(5,6)), list(1,c(2,3,5),c(6,4)))
Run Code Online (Sandbox Code Playgroud)

algorithm performance if-statement r list

9
推荐指数
2
解决办法
360
查看次数

变换单位矩阵

我有单位矩阵,可以通过生成diag(5)

     [,1] [,2] [,3] [,4] [,5]
[1,]    1    0    0    0    0
[2,]    0    1    0    0    0
[3,]    0    0    1    0    0
[4,]    0    0    0    1    0
[5,]    0    0    0    0    1
Run Code Online (Sandbox Code Playgroud)

我想将其转换为矩阵,其中系列在 1 之后开始。例如,第一列,值 1 到 5。第二列 - 值 1 到 4。

所需输出

    [,1] [,2] [,3] [,4] [,5]
[1,]    1   0   0   0   0
[2,]    2   1   0   0   0
[3,]    3   2   1   0   0
[4,]    4   3   2   1   0
[5,]    5 …
Run Code Online (Sandbox Code Playgroud)

r matrix

9
推荐指数
2
解决办法
332
查看次数

将现有 Cov 矩阵转换为块对角线

我有一个现有的协方差矩阵,我想根据各个列所属的组将其转换为块对角线(例如,第 2 行/列是第 1 组,接下来是第 2 组等)是否有一种简单的方法这样做:

下面是我所拥有的示例:

m1 <- matrix(1:16, ncol=4, byrow=TRUE)
rownames(m1) <- colnames(m1 ) <- c('a', 'b', 'c', 'd')

   a  b  c  d
a  1  2  3  4
b  5  6  7  8
c  9 10 11 12
d 13 14 15 16
Run Code Online (Sandbox Code Playgroud)

我有2组:

第 1 组:“a”、“b”

第 2 组:“c”、“d”

我想要什么:

   a  b  c  d
a  1  2  0  0
b  5  6  0  0
c  0  0 11 12
d  0  0 15 16
Run Code Online (Sandbox Code Playgroud)

r matrix

9
推荐指数
5
解决办法
447
查看次数

如何仅在嵌套列表中在最深层次上运行函数?

给定一个嵌套列表,例如如下

lst <- list(
    1,
    list(list(c(4, 5, 4)), list(c(6, 7))),
    list(c(2, 3, 3)),
    list(list(c(5, 5, 6)), list(c(7, 7, 7)))
)

> str(lst)
List of 4
 $ : num 1
 $ :List of 2
  ..$ :List of 1
  .. ..$ : num [1:3] 4 5 4
  ..$ :List of 1
  .. ..$ : num [1:2] 6 7
 $ :List of 1
  ..$ : num [1:3] 2 3 3
 $ :List of 2
  ..$ :List of 1
  .. ..$ : num [1:3] …
Run Code Online (Sandbox Code Playgroud)

r list

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

R - 更有效的 left_join

我有两个数据帧 - 一个包含名称和限制范围(只有几百行,最多 1000),需要分配给一个“测量”数据帧,该数据帧可以包含数百万行(或数百万行) )。

目前我正在做 left_join 和过滤值以获得分配给每个测量的特定限制。然而,这是非常低效的并且花费了大量资源。对于较大的数据帧,代码甚至无法运行。

任何关于更有效解决方案的想法都会有所帮助。

library(dplyr)

## this one has got only few houndreds rows
df_limits <- read.table(text="Title station_id  limit_from  limit_to
Level_3_Low 1   0   70
Level_2_Low 1   70  90
Level_1_Low 1   90  100
Optimal 1   100 110
Level_1_High    1   110 130
Level_2_High    1   130 150
Level_3_High    1   150 180
Level_3_Low 2   0   70
Level_2_Low 2   70  90
Level_1_Low 2   90  100
Optimal 2   100 110
Level_1_High    2   110 130
Level_2_High    2   130 150
Level_3_High    2   150 …
Run Code Online (Sandbox Code Playgroud)

database r left-join data.table

8
推荐指数
3
解决办法
271
查看次数

我们如何检查唯一 ID 的任何 2 个间隔是否重叠?

我有口服DM药物的患者处方数据,即DPP4和SU,想知道患者是否同时服用了药物(即同一患者中DPP4和SU的间隔是否重叠ID)。

样本数据:

  ID DRUG      START        END
1  1 DPP4 2020-01-01 2020-01-20
2  1 DPP4 2020-03-01 2020-04-01
3  1   SU 2020-03-15 2020-04-30
4  2   SU 2020-10-01 2020-10-31
5  2 DPP4 2020-12-01 2020-12-31
Run Code Online (Sandbox Code Playgroud)

在上面的样本数据中,

  1. ID == 1,患者从有DPP-4和SU同时2020-03-152020-04-01
  2. ID == 2,患者以不同的时间间隔服用了两种药物。

我想将数据分成 2 个,一个用于 DPP4,另一个用于 SU。然后,进行完全连接,并将每个 DPP4 间隔与每个 SU 间隔进行比较。这对于小数据可能没问题,但如果患者有 5 行 DPP4 和另外 5 行 SU,我们将有 25 次比较,这可能效率不高。加上 10000 多名患者。

我不知道该怎么做。

新数据:

希望有一个看起来像这样的新 df。或者任何整洁的东西。

  ID    DRUG      START        END
1  1 DPP4-SU 2020-03-15 2020-04-01 …
Run Code Online (Sandbox Code Playgroud)

performance r data-manipulation dplyr tidyr

8
推荐指数
3
解决办法
123
查看次数

R - mgsub 问题:被替换的子字符串不是整个字符串

我已经从 USPS 下载了街道缩写。这是数据:

dput(usps_streets)
structure(list(common_abbrev = c("allee", "alley", "ally", "aly", 
"anex", "annex", "annx", "anx", "arc", "arcade", "av", "ave", 
"aven", "avenu", "avenue", "avn", "avnue", "bayoo", "bayou", 
"bch", "beach", "bend", "bnd", "blf", "bluf", "bluff", "bluffs", 
"bot", "btm", "bottm", "bottom", "blvd", "boul", "boulevard", 
"boulv", "br", "brnch", "branch", "brdge", "brg", "bridge", "brk", 
"brook", "brooks", "burg", "burgs", "byp", "bypa", "bypas", "bypass", 
"byps", "camp", "cp", "cmp", "canyn", "canyon", "cnyn", "cape", 
"cpe", "causeway", "causwa", "cswy", "cen", "cent", "center", 
"centr", "centre", "cnter", "cntr", "ctr", "centers", "cir", 
"circ", "circl", …
Run Code Online (Sandbox Code Playgroud)

string performance r gsub

8
推荐指数
3
解决办法
398
查看次数

如何检查第一个数据帧中的值是否包含或与另一个数据帧中的值匹配

我正在使用R一些数据框。我的问题与如何检查第一个数据帧中的变量值是否与另一个数据帧中的值匹配有关。merge该匹配与或 之类的匹配非常不同join。我将介绍我的数据框(dput()最后):

我的第一个数据框是df1. name它包含我想与第二个数据帧中的其他变量进行对比的变量。它看起来像这样:

df1
                   name
1            JUAN GIRON
2            GINA OLEAS
3 JUAN FERNANDO ELIZAGA
4          MARCO TORRES
5   JUAN PABLO GONZALEZ
6            IRMA GOMEZ
Run Code Online (Sandbox Code Playgroud)

第二个数据框是df2. 它还包含一个变量name,用于与namefrom进行对比df1。它看起来像这样(在实际情况中df2可能非常大,超过 1000 行):

df2
                      name val
1            JUANA MARQUEZ   1
2         FERNANDO ELIZAGA   2
3               IRMA GOMEZ   3
4           PABLO GONZALEZ   4
5               GINA LUCIO   5
6              MARK TORRES   6
7           LETICIA …
Run Code Online (Sandbox Code Playgroud)

string r dplyr partial-matches

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

使用“regex”反转字符串的任何简洁方法,例如,在 R 中使用“gsub”?(寻找解决方法)

我知道我们可以使用其他更有效的non-regex方式来做到这一点,例如+或+ ,但我想知道我们是否可以仅使用正则表达式来完成它。revstrsplitrevsubstring


例如,假设我们有一个 string s1 <- "ab82m4",我的gsub尝试是

> gsub(strrep("(.)", nchar(s1)), paste0(sprintf("\\%d", nchar(s1):1), collapse = ""), s1)
[1] "4m28ba"
Run Code Online (Sandbox Code Playgroud)

效果很好但很麻烦。

然而,当我们有更长的 刺 时s2 <- "ab82m42,x7",我们无法达到所需的输出,因为组数超过,这超出了(我猜)9允许的上限gsub

> gsub(strrep("(.)", nchar(s2)), paste0(sprintf("\\%d", nchar(s2):1), collapse = ""), s2)
[1] "a0x,24m28ba" # should be "7x,24m28ba"
Run Code Online (Sandbox Code Playgroud)

我只是想知道是否有一种模式或解决方法可以应用gsub来反转字符串。确实对这种可能性感到好奇!:)


强调

我很好奇实现目标的可能解决方法(而不是分组),即以正则表达式的方式反转字符串,而不是在这里讨论使用分组的可行性

regex string r gsub

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

连续整数的唯一字符串组合

我有一个 0-9 的整数向量,需要这些连续向量元素的所有唯一可能的组合,包括原始元素。

> vec <- 0:9
> vec
 [1] 0 1 2 3 4 5 6 7 8 9
Run Code Online (Sandbox Code Playgroud)

任务类似于这个问题。主要(也是棘手的)区别是我只需要连续组合(例如"0", "01", "012", ... "0123456789", ... "1", ... "123456789")而不是非连续组合(例如"013")。

我将如何创建这个组合子集?

combinations r vector

7
推荐指数
1
解决办法
141
查看次数