基于向量子集对数据框进行索引

6

我有一个非常大的数据框,想根据向量的某个子集保存其中的一个子集。简而言之,我有类似以下的内容:

> 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

我希望能够获取所有已标记的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

然而我只是想到达这里:
> 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

我觉得这个问题应该比我想象的简单,但是我尝试了很多可能性来解决这个问题,都没有成功。写出这个问题有助于让我在脑海中更清晰/更简单地理解这个问题(现在看起来我只是缺少一个步骤),但我也想知道是否有更有效的方法来解决这个问题。

3个回答

6

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

甚至更加简洁
DT[J(unique(id[status=='flag']))]

以上两种方法都利用了data.table首先计算i组件的事实。通过按id排序,我们可以进行自连接,以提取仅具有status=='flag'的那些ids


或者,使用by

DT[,if(any(status=='flag')){.SD} ,by=id]

这个代码通过id的子集,如果在该子集中存在status=='flag',则返回.SD(该子集的数据表)。


非常优雅!谢谢你的回答! - stites

2

这似乎可行:

df[df$id %in% df$id[df$status == "flag"],]

从数据框中选择每一行,其id元素在任何行中标记状态的id元素向量中。

1

我相信你想要做的事情可以在一行代码中处理。

df[which(df$id %in% df$id[df$status=="flag"]), ]

结果:

   id status misc1ofmany
1 ID1   flag        etc1
2 ID2   flag        etc2
3 ID2   none        etc3
5 ID4   flag        etc5
6 ID4   flag        etc6
7 ID4   flag        etc7
8 ID4   none        etc8
9 ID4   flag        etc9

他似乎想要在已经被标记的情况下保留ID和行。这仅保留那些被标记的内容。 - Brandon Bertelsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接