小编EDC*_*EDC的帖子

根据逻辑向量选择data.table中的列

假设我有以下data.frame和以下data.table:

DF = data.frame(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9)
DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9)
Run Code Online (Sandbox Code Playgroud)

使用data.frame,我可以根据逻辑向量选择列,如下所示:

DF[,c(TRUE,TRUE,FALSE)]
Run Code Online (Sandbox Code Playgroud)

结果是:

  x y
1 a 1
2 a 3
3 a 6
4 b 1
5 b 3
6 b 6
7 c 1
8 c 3
9 c 6
Run Code Online (Sandbox Code Playgroud)

然而

DT[,c(TRUE,TRUE,FALSE)]
Run Code Online (Sandbox Code Playgroud)

导致:

[1]  TRUE  TRUE FALSE
Run Code Online (Sandbox Code Playgroud)

怎么做到呢?

r logical-operators data.table

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

通过 R 中的 fread 以块的形式读取数据

我试图在 R 中读取一个巨大的数据集(> 25GB)。它不适合我的 PC 内存。但我认为,如果数据采用压缩 (RData) 格式,也许可以处理数据。作为该过程的一部分,我还必须将列类更改为字符,因为某些列包含数字和字符串的混合。这怎么能做到fread呢?

第一部分总是很简单,我们可以使用例如以下代码来读取 10m 行:

part1 <- fread(filename,sep = " ", stringsAsFactors = FALSE, header = TRUE, 
      nrows = 10000000,showProgress = TRUE, 
      colClasses=c(AA="character",BB="character"))
Run Code Online (Sandbox Code Playgroud)

但是如果我尝试读取文件的第二部分,我总是会收到错误消息。我正在使用以下代码跳过前 1000000 行,这些行之前已经读入。我也设置headerFALSE

part2 <- fread(filename,sep = " ", stringsAsFactors = FALSE, header = FALSE, 
      nrows = 10000000,skip=10000000,showProgress = TRUE, 
      colClasses=c(AA="character",BB="character"))
Run Code Online (Sandbox Code Playgroud)

错误消息是:

Error in fread()  :  Column name 'AA' in colClasses[[1]] not found
Run Code Online (Sandbox Code Playgroud)

注意:如果我们设置了header = TRUE,错误信息仍然会出现。

我无法给出这种大小的示例数据集,但我想问题很简单,如果我们使用skip,列名就会丢失,然后当我们设置colClasses. 有什么方法可以使用 fread 还是必须使用其他软件包?

datatable r fread

5
推荐指数
0
解决办法
573
查看次数

优化VBA中删除隐藏行的性能

在 VBA 中将自动过滤器应用于大表后,我使用以下代码删除隐藏/过滤的行(大意味着大约 30,000 行):

Sub RemoveHiddenRows()
Dim oRow As Range, rng As Range
Dim myRows As Range
With Sheets("Sheet3")
    Set myRows = Intersect(.Range("A:A").EntireRow, .UsedRange)
    If myRows Is Nothing Then Exit Sub
End With

For Each oRow In myRows.Columns(1).Cells
    If oRow.EntireRow.Hidden Then
        If rng Is Nothing Then
            Set rng = oRow
        Else
            Set rng = Union(rng, oRow)
        End If
    End If
Next
If Not rng Is Nothing Then rng.EntireRow.Delete
End Sub
Run Code Online (Sandbox Code Playgroud)

代码来自这里:Delete Hidden/Invisible Rows after Autofilter Excel VBA

此外,我阅读了此线程: …

excel performance vba loops filter

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

增长的矢量化

我正在寻找一种解决方案,通过在R中应用矢量化来实现以下简单的增长率公式:

gr <- function(x){
a <- matrix(,nrow=nrow(x),ncol=ncol(x))
   for (j in 1:ncol(x)){
      for (i in 2:nrow(x)){
        if (!is.na(x[i,j]) & !is.na(x[i-1,j]) & x[i-1,j] != 0){
           result[i,j] <- x[i,j]/x[i-1,j]-1 
        }
       }
    }
return(a)
}
Run Code Online (Sandbox Code Playgroud)

我发现xts包会产生时间序列的滞后,但最后我总是不得不与许多值进行比较(见上文),所以我不能简单地使用ifelse.一个可能的问题是当时间序列(例如价格指数)之间有零.这将NaNs在结果中创建,我试图避免,之后不能简单地删除(编辑:显然他们可以,看下面的答案!)

简而言之:我想为给定的值表生成一个正确增长率的表.这是一个例子:

m <- matrix(c(1:3,NA,2.4,2.8,3.9,0,1,3,0,2,1.3,2,NA,7,3.9,2.4),6,3)
Run Code Online (Sandbox Code Playgroud)

产生:

      [,1] [,2] [,3]
[1,]  1.0  3.9  1.3
[2,]  2.0  0.0  2.0
[3,]  3.0  1.0   NA
[4,]   NA  3.0  7.0
[5,]  2.4  0.0  3.9
[6,]  2.8  2.0  2.4
Run Code Online (Sandbox Code Playgroud)

正确的结果,产生于gr(m):

           [,1] [,2]       [,3]
[1,]        NA   NA         NA
[2,] 1.0000000 …
Run Code Online (Sandbox Code Playgroud)

loops r vectorization large-data

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

从嵌套列表中组合不同长度的元素

给出以下结构:

a <- list()
a[[1]] <- list(c(1:3),c(3:8))
a[[2]] <- list(c(2:6),c(7:9),c(18:24))
a[[3]] <- list(c(11:13),c(10:16),c(17:19),c(11:14),c(17:20))
Run Code Online (Sandbox Code Playgroud)

这意味着a[[1]]有2个元素,a[[2]]3个元素和a[[3]]5个元素.

我想从a中的元素创建所有可能的组合.因此,例如,a[[1]][1]可以结合a[[2]][1],a[[2]][2]a[[2]][3].所有这些结果都可以与a[[3]][1]...... 结合使用a[[3]][5](总之它应该是30种组合).通过组合我的意思是应用于c元素.

我假设这归结为搜索树末端的元素(例如,如果我在阶段1中有A1或A2,阶段2中有B1或B2,阶段3中有C1或C2,则所有结果都是:A1B1C1,A1B1C2,A1B2C1 ,A1B2C2,A2B1C1,A2B1C2,A2B2C1,A2B2C2.)

好的,现在我知道如何使用三重嵌套循环执行此操作,但如果列表a变大,会发生什么?我不知道是否可以这样做.任何建议赞赏.

combinations r list

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

突出显示重复行

我想突出显示 Excel VBA 中的重复行。假设我有以下示例表,其中包含 A、B、C 和 D 列用于测试:

 A       B       C       D (Strings)

 1       1       1       dsf
 2       3       5       dgdgdgdg
 1       1       1       dsf
 2       2       2       xxx
 6       3       4       adsdadad
 2       2       2       xxx
Run Code Online (Sandbox Code Playgroud)

重复的行应该以任何颜色突出显示,例如灰色。我理想地寻找快速执行的代码,因为它将用于相当大的表。请注意,有一些解决方案可用于突出显示重复的单元格(但不突出显示重复的行)。我不知道如何识别行是否重复,同时如何快速做到这一点,即没有嵌套循环。解决方案应该是 VBA(而不是 Excel)。

实现这一目标的最佳/最快方法是什么?

excel performance vba loops

-3
推荐指数
1
解决办法
6361
查看次数