小编Nau*_*umz的帖子

理解R regexp中的先行

我正在尝试使用多个前瞻来模拟R Perl类型正则表达式中的AND运算符grep.但是,我不明白我看到的输出.这是一个示例代码块

a <- c("abcxyz", "abcdef", "defxyz", "abcdefxyz", "xyzdefabc")
grep("(?<=abc)(?=xyz)", a, ignore.case=TRUE, perl=TRUE)  # returns 1
grep("(?=abc)(?=xyz)", a, ignore.case=TRUE, perl=TRUE)  # returns integer(0)
Run Code Online (Sandbox Code Playgroud)

第二行表明字符串中的位置在abc和xyz之间,并匹配'abcxyz'.为什么它不匹配'abcdefxyz'?

在第三行,我试图输出1,4和5,但它返回未找到.为什么会这样?

我正在使用下面的替代解决方案,但我想在处理多个前瞻时使用前瞻来处理排序.

grep("abc.*xyz|xyz.*abc", a, ignore.case=TRUE, perl=TRUE)  # returns 1 4 5 as expected
Run Code Online (Sandbox Code Playgroud)

regex r

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

使用R中的data.table子集列

我正在尝试通过从data.table中选择一些列来对数据集进行子集化.但是,我的代码不适用于某些变体.

这是一个示例data.table

library(data.table)
DT <- data.table( ID = 1:50,
            Capacity = sample(100:1000, size = 50, replace = F),
            Code = sample(LETTERS[1:4], 50, replace = T),
            State = rep(c("Alabama","Indiana","Texas","Nevada"), 50))
Run Code Online (Sandbox Code Playgroud)

这是一个有效的子集代码:

DT[ , 1:2]
Run Code Online (Sandbox Code Playgroud)

这是一段不起作用的代码.请注意,这适用于数据框,但不适用于data.table.

DT[ , seq(1:2)]
Run Code Online (Sandbox Code Playgroud)

我需要第二种格式的东西,因为我是基于grep()的输出进行子集化,它提供与第二种格式相同的输出.我做错了什么?

谢谢!

r data.table

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

结合"by"和"on"来连接并创建data.table的汇总列

我有两个数据集,一个是详细的数据集,weight另一个是应该是摘要数据集.我试图通过加入详细数据集和聚合来创建摘要数据集,但它没有按预期工作.

这是一个示例代码.

mytesta <- data.table(cola = c("a","b"), groupa = c(1,2))  # summary
mytestb <- data.table(groupa = c(1,1,1,1,2,2,2), weighta = c(10,20,30,25,15,30,10))  #detail
Run Code Online (Sandbox Code Playgroud)

这是我想要的输出.

   cola groupa weighta
1:    a      1      85
2:    b      2      55
Run Code Online (Sandbox Code Playgroud)

我试图做的是,

mytesta[mytestb, on = "groupa", weight_summary := sum(i.weighta), by = "groupa"]
Run Code Online (Sandbox Code Playgroud)

问题是当by使用时,内部data.table的列消失(例如mytesta[mytestb, on = "groupa", .SD, by = "groupa"]).有没有解决的办法?

r data.table

5
推荐指数
1
解决办法
86
查看次数

在data.table中查找重复的列

我有一个非常大的data.table(500 x 2000),我需要找出是否有任何列是重复的,即所有行都有相同的值.有没有办法在data.table结构中有效地执行此操作?

我已经all(col1 == col2)为每对列尝试了一种天真的双循环方法,但这需要太长时间.我也尝试将其转换为data.frame并使用上述方法,但仍需要相当长的时间.

我目前的解决方案是将data.table转换为矩阵并使用以下apply()函数:

similarity.matrix <- apply(m, 2, function(x) colSums(x == m)))/nrow(m)
Run Code Online (Sandbox Code Playgroud)

然而,这种方法迫使所有元素的模式相同,而我宁愿不会发生这种情况.我还有其他选择吗?

以下是data.table的示例构造:

m = matrix(sample(1:10, size=1000000, replace=TRUE), nrow=500, ncol=2000)
DF = as.data.frame(m)
DT = as.data.table(m)
Run Code Online (Sandbox Code Playgroud)

r data.table

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

标签 统计

r ×4

data.table ×3

regex ×1