我比较熟悉data.table,而不是那么熟悉dplyr.我已经阅读了一些出现在SO上的dplyr小插曲和例子,到目前为止我的结论是:
data.table并且dplyr在速度上具有可比性,除非有许多(即> 10-100K)组,并且在某些其他情况下(参见下面的基准)dplyr 有更多可访问的语法dplyr 摘要(或将)潜在的DB交互在我看来2.没有多大的重量,因为我对它很熟悉data.table,虽然我明白对于那些对这两者都不熟悉的用户来说这将是一个很重要的因素.我想避免争论哪个更直观,因为这与我从已经熟悉的人的角度提出的具体问题无关data.table.我还想避免讨论"更直观"如何导致更快的分析(当然是真的,但同样,不是我最感兴趣的).
我想知道的是:
最近的一个问题让我更多地思考这个问题,因为直到那时我才认为dplyr会提供超出我已经做过的东西data.table.这是dplyr解决方案(Q末尾的数据):
dat %.%
group_by(name, job) %.%
filter(job != "Boss" | year == min(year)) %.%
mutate(cumu_job2 = cumsum(job2))
Run Code Online (Sandbox Code Playgroud)
这比我的黑客尝试data.table解决方案要好得多.也就是说,好的data.table解决方案也相当不错(感谢Jean-Robert,Arun,并注意到这里我赞成对最严格的最佳解决方案的单一陈述):
setDT(dat)[,
.SD[job != "Boss" | year == min(year)][, cumjob := cumsum(job2)],
by=list(id, job)
]
Run Code Online (Sandbox Code Playgroud)
后者的语法可能看起来非常深奥,但如果你习惯了data.table(即不使用一些更深奥的技巧),它实际上非常简单.
理想情况下,我希望看到的是一些很好的例子,dplyr …
我有一个数据框,有些列有NA值.
如何NA用零替换这些值?
我有这样的data.table
dput(DT)
structure(list(ref = c(3L, 3L, 3L, 3L), nb = 12:15, i1 = c(3.1e-05,
0.044495, 0.82244, 0.322291), i2 = c(0.000183, 0.155732, 0.873416,
0.648545), i3 = c(0.000824, 0.533939, 0.838542, 0.990648), i4 = c(0.044495,
0.82244, 0.322291, 0.393595)), .Names = c("ref", "nb", "i1",
"i2", "i3", "i4"), row.names = c(NA, -4L), class = c("data.table",
"data.frame"), .internal.selfref = <pointer: 0x0000000000320788>)
DT
# ref nb i1 i2 i3 i4
# 1: 3 12 0.000031 0.000183 0.000824 0.044495
# 2: 3 13 0.044495 0.155732 0.533939 0.822440
# …Run Code Online (Sandbox Code Playgroud) 如果你有一个缺少值的R data.table,你如何用值0替换所有这些值?例如
aa = data.table(V1=1:10,V2=c(1,2,2,3,3,3,4,4,4,4))
bb = data.table(V1=3:6,X=letters[1:4])
setkey(aa,V1)
setkey(bb,V1)
tt = bb[aa]
V1 X V2
1: 1 NA 1
2: 2 NA 2
3: 3 a 2
4: 4 b 3
5: 5 c 3
6: 6 d 3
7: 7 NA 4
8: 8 NA 4
9: 9 NA 4
10: 10 NA 4
Run Code Online (Sandbox Code Playgroud)
有没有办法在一行中做到这一点?如果它只是一个矩阵,你可以这样做:
tt[is.na(tt)] = 0
Run Code Online (Sandbox Code Playgroud) 假设有以下数据表:
DT <- data.table(a=c(1,2,3,4,5,6),b=c(NaN,NaN,NaN,4,5,6),c=c(NaN,3,3,3,NaN,NaN))
Run Code Online (Sandbox Code Playgroud)
如何将每列中的所有NaN值替换为, 即?NA寻找一种优雅(简短)的方法来做到这一点,但我也想知道是否可以使用lapply,就像我在下面尝试的那样。
到目前为止我的方法:
DT[,lapply(SD,function(x){x[is.nan(x)] := NA}),.SDcols=c("a","b","c")]
Run Code Online (Sandbox Code Playgroud)
我的代码的实际结果是:
(x[is.nan(x)], NA)中的错误
:=:检查 is.data.table(DT) == TRUE。否则,:= 和:=(...) 被定义为在 j 中使用,仅一次且以特定方式使用。请参阅帮助(“:=”)。
我正在寻找一个通用的解决方案来更新一个大数据帧与第二个类似数据帧的内容.我有几十个数据集,每个数据集有数千行,超过10,000列."更新"数据集将与其对应的"基础"数据集重叠,从几个百分点到大约百分之五十,行方向.数据集具有"键"列,并且在任何给定数据集中每个唯一键值只有一行.
基本规则是:如果给定单元格的更新数据集中存在非NA值,则使用该值替换基础数据集中的相同单元格.("相同单元格"表示"key"列和colname的相同值.)
请注意,更新数据集可能包含我可以使用rbind处理的新行("插入").
因此,给定基础数据框"df1",其中列"K"是唯一键列,"P1"."P3"代表10,000列,其名称将从一对数据集到下一个数据集变化:
K P1 P2 P3
1 A 1 1 1
2 B 1 1 1
3 C 1 1 1
Run Code Online (Sandbox Code Playgroud)
...和更新数据框"df2":
K P1 P2 P3
1 B 2 NA 2
2 C NA 2 2
3 D 2 2 2
Run Code Online (Sandbox Code Playgroud)
我需要的结果如下,其中"B"和"C"的1被2覆盖,但没有被NA覆盖:
K P1 P2 P3
1 A 1 1 1
2 B 2 1 2
3 C 1 2 2
4 D 2 2 2
Run Code Online (Sandbox Code Playgroud)
这似乎不是合并候选者,因为合并给我重复行(相对于"关键"列)或重复列(例如P1.x,P1.y),我必须迭代以折叠某种方式.
我已经尝试预先分配一个矩阵,其中包含最终行/列的维度,并用df1的内容填充它,然后迭代df2的重叠行,但我不能比每秒20个单元格的性能更好,需要几小时完成(与SAS中等效的DATA step UPDATE功能的分钟数相比).
我确定我错过了什么,但找不到类似的例子.
我看到ddply用法看起来很接近,但不是一般的解决方案.该data.table软件包似乎没有帮助,因为对我来说这是一个连接问题并不明显,至少通常没有这么多列.
另外一个只关注交叉行的解决方案就足够了,因为我可以识别其他行并将其绑定.
以下是制作上述数据框的一些代码:
cat("K,P1,P2,P3", "A,1,1,1", …Run Code Online (Sandbox Code Playgroud) 我有一个大的数值数据集(约700行,350,000列,作为R中的data.table读入)包含一些NA,我想尽快用列表示替换.我发现之前的帖子用NA代替NA,但是当我修改解决方案而不是输入列意味着时,我得到j,列号.似乎我必须遗漏一些明显的东西...关于如何计算列的任何建议意味着使用这种方法?
#original code
f_dowle3 = function(DT) {
for(j in seq_len(ncol((DT)))
set(DT,which(is.na(DT[[j]])),j,0)
}
#modified code
impute = function(DT) {
for(j in 2:ncol(DT))
set(DT,which(is.na(DT[[j]])),j,mean(DT[,j],na.rm = TRUE))
}
test_impute = fread("test_impute.csv")
test_impute
ID snp1 snp2 snp3 snp4
1: 1 2 1 1 0
2: 2 2 2 0 0
3: 3 2 NA 0 NA
4: 4 2 1 2 0
5: 5 2 NA 2 0
6: 6 2 1 1 0
7: 7 1 1 NA 0
8: 8 NA …Run Code Online (Sandbox Code Playgroud) 我有一个名为"mat"的49952 obs的大数据框.7597变量,我试图用零替换NA.以下是我的data.frame的示例:
A B C E F D Q Z . . .
1 1 1 0 NA NA 0 NA NA
2 0 0 1 NA NA 0 NA NA
3 0 0 0 NA NA 1 NA NA
4 NA NA NA NA NA NA NA NA
5 0 1 0 1 NA 0 NA NA
6 1 1 1 0 NA 0 NA NA
7 0 0 1 0 NA 1 NA NA
.
.
.
Run Code Online (Sandbox Code Playgroud)
我需要真正的快速工具来替换它们.结果应如下所示: …
设DT为data.table:
DT<-data.table(V1=sample(10),
V2=sample(10),
...
V9=sample(10),)
Run Code Online (Sandbox Code Playgroud)
是否有更好/更简单的方法来执行多列重新编码/子分配,如下所示:
DT[V1==1 | V1==7,V1:=NA]
DT[V2==1 | V2==7,V2:=NA]
DT[V3==1 | V3==7,V3:=NA]
DT[V4==1 | V4==7,V4:=NA]
DT[V5==1 | V5==7,V5:=NA]
DT[V6==1 | V6==7,V6:=NA]
DT[V7==1 | V7==7,V7:=NA]
DT[V8==1 | V8==7,V8:=NA]
DT[V9==1 | V9==7,V9:=NA]
Run Code Online (Sandbox Code Playgroud)
变量名称完全是任意的,不一定有数字.许多列(Vx:Vx)和一个重新编码模式(NAME == 1 | NAME == 7,NAME:= something).
而且,如何多列将NA分配给其他东西.例如data.frame风格:
data[,columns][is.na(data[,columns])] <- a_value
Run Code Online (Sandbox Code Playgroud) library(tidyverse)
df <- tibble(Date = c(rep(as.Date("2020-01-01"), 3), NA),
col1 = 1:4,
thisCol = c(NA, 8, NA, 3),
thatCol = 25:28,
col999 = rep(99, 4))
#> # A tibble: 4 x 5
#> Date col1 thisCol thatCol col999
#> <date> <int> <dbl> <int> <dbl>
#> 1 2020-01-01 1 NA 25 99
#> 2 2020-01-01 2 8 26 99
#> 3 2020-01-01 3 NA 27 99
#> 4 NA 4 3 28 99
Run Code Online (Sandbox Code Playgroud)
我实际的 R 数据框有数百列,这些列的命名并不明确,但可以通过df上面的数据框进行近似。
我想用 替换所有值,NA但 …
为了节省空间,我从CSV文件中省略了零作为一种稀疏表示(所有数据都是数字):
table = read.csv(text = "
V1,V2,V3
0.3,1.2,1.5
0.5,,2.1
,.1,")
Run Code Online (Sandbox Code Playgroud)
这是我得到的:
> table
V1 V2 V3
1 0.3 1.2 1.5
2 0.5 NA 2.1
3 NA 0.1 NA
Run Code Online (Sandbox Code Playgroud)
我可以继续将NAs更改为0:
table[is.na(table)] = 0
V1 V2 V3
1: 0.3 1.2 1.5
2: 0.5 0.0 2.1
3: 0.0 0.1 0.0
Run Code Online (Sandbox Code Playgroud)
只是想知道在阅读时是否有一个单行班,最好是data.table的fread?:
table = fread("
V1,V2,V3
0.3,1.2,1.5
0.5,,2.1
,.1,")
Run Code Online (Sandbox Code Playgroud)
更多信息:我想避免的原因
table[is.na(table)] = 0
Run Code Online (Sandbox Code Playgroud)
是因为对我的数据的执行速度非常快,这个操作非常慢!(不确定原因.)我的数据集是336行x 3939列.(G.格洛腾迪克的定制课程答案很快,谢谢你的想法!)
可能重复:
将R中的所有0值替换为NA
离开这个问题.R中是否有类似的功能,x[is.na(x)] <- 0除了它会将矩阵中的每个零都改变为NA?
r ×13
data.table ×8
dataframe ×3
na ×3
imputation ×2
csv ×1
dplyr ×1
large-data ×1
matrix ×1
missing-data ×1
recode ×1
select ×1
tidyr ×1
tidyselect ×1