假设我有以下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 中读取一个巨大的数据集(> 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 行,这些行之前已经读入。我也设置header
为FALSE
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 还是必须使用其他软件包?
在 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
此外,我阅读了此线程: …
我正在寻找一种解决方案,通过在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) 给出以下结构:
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变大,会发生什么?我不知道是否可以这样做.任何建议赞赏.
我想突出显示 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)。
实现这一目标的最佳/最快方法是什么?
r ×4
loops ×3
excel ×2
performance ×2
vba ×2
combinations ×1
data.table ×1
datatable ×1
filter ×1
fread ×1
large-data ×1
list ×1