sti*_*tes 6 r subset dataframe
我有一个非常大的数据帧,我想根据矢量的某个子集保存一个子集.总之,我有这样的事情:
> id<-c("ID1","ID2","ID2","ID3","ID4","ID4","ID4","ID4","ID4")
> status<-c("flag","flag","none","none","flag","flag","flag","none","flag")
> misc1ofmany<-c("etc1","etc2","etc3","etc4","etc5","etc6","etc7","etc8","etc9")
> df = data.frame(id, status, misc1ofmany) ; df
id status misc1ofmany
1 ID1 flag etc1
2 ID2 flag etc2
3 ID2 none etc3
4 ID3 none etc4
5 ID4 flag etc5
6 ID4 flag etc6
7 ID4 flag etc7
8 ID4 none etc8
9 ID4 flag etc9
Run Code Online (Sandbox Code Playgroud)
我想要标记所有已标记的ID行,包括其未标记的会话.现在我正试图通过grep获取其他ID的索引并将其插回到新的df中.实际上,当我写出来时,我发现grepl可能更容易使用:
> flaggedIDs <- unique(as.vector(df$id[grep("flag",df$status)]))
> flaggedIDs.allStats.Index <- mapply(grepl,df$id,MoreArgs=list(x=flaggedIDs))
> flaggedIDs.allStats.Index
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[2,] FALSE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
[3,] FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE
Run Code Online (Sandbox Code Playgroud)
但是我只想到这里:
> flaggedIDsdf <- df[flaggedIDs.allStats.Index] ; flaggedIDsdf
id status misc1ofmany
1 ID1 flag etc1
2 ID2 flag etc2
3 ID2 none etc3
4 ID4 flag etc5
5 ID4 flag etc6
6 ID4 flag etc7
7 ID4 none etc8
8 ID4 flag etc9
Run Code Online (Sandbox Code Playgroud)
我觉得这应该比我做的更简单,但是我已经尝试了很多可能性来解决这个问题无济于事.写出这个问题有助于我在脑海中成为一个更清晰/更简单的问题(看起来我现在只是缺少一步),但现在我也想知道是否有更有效的方法来解决这个问题.
data.table 这里非常有用,因为它具有优雅的语法和内存效率
library(data.table)
DT <- data.table(df)
setkey(DT, 'id')
DT[DT[status=='flag', list(id = unique(id))]]
id status misc1ofmany
1: ID1 flag etc1
2: ID2 flag etc2
3: ID2 none etc3
4: ID4 flag etc5
5: ID4 flag etc6
6: ID4 flag etc7
7: ID4 none etc8
8: ID4 flag etc9
Run Code Online (Sandbox Code Playgroud)
甚至更紧凑
DT[J(unique(id[status=='flag']))]
Run Code Online (Sandbox Code Playgroud)
上述两种方法使用的i是首先评估组件的事实data.table.通过键控id手段,我们可以做一个自联接只提取那些ids地方status=='flag.
或者,使用 by
DT[,if(any(status=='flag')){.SD} ,by=id]
Run Code Online (Sandbox Code Playgroud)
这遍历DTby 的子集id,并返回.SD(子集的data.table)if any(status=='flag')(在该子集内).
| 归档时间: |
|
| 查看次数: |
328 次 |
| 最近记录: |