【问题标题】:Select rows from a data frame according to another vector, including repetitions根据另一个向量从数据框中选择行,包括重复
【发布时间】:2016-06-21 06:44:17
【问题描述】:

示例数据:

dates=seq(as.POSIXct("2015-01-01 00:00:00"), as.POSIXct("2015-01-07 00:00:00"), by="day")
data=rnorm(7,1,2)
groupID=c(12,14,16,24,35,46,54)

DF=data.frame(Date=dates,Data=data,groupID=groupID)

BB=c(12,12,16,24,35,35)
DF[DF$groupID %in% BB,]

        Date       Data groupID
1 2015-01-01  4.4104202       12
3 2015-01-03  2.1557735       16
4 2015-01-04 -0.9880946       24
5 2015-01-05 -0.3396025       35

我需要根据向量 BB 中与 groupID 列匹配的值过滤数据框 DF。但是,如果BB 包含重复,则不会反映在结果中。

由于我的向量 BB 包含两个值 1 和两个 5,因此输出实际上应该是:

        Date       Data groupID
1 2015-01-01  4.4104202       12
1 2015-01-01  4.4104202       12
3 2015-01-03  2.1557735       16
4 2015-01-04 -0.9880946       24
5 2015-01-05 -0.3396025       35
5 2015-01-05 -0.3396025       35

有没有办法做到这一点?并尽可能保持向量BB 的顺序?

【问题讨论】:

  • 我可以看到我的问题是如何出现的。我现在已经编辑过了。我的“BB”向量需要匹配 groupID 列,所以恐怕我不能使用行标签。
  • 那么可能是DF[match(BB, DF$groupID),]

标签: r vector dataframe subset repeat


【解决方案1】:

使用match()(或findInterval()):

DF[match(BB,DF$groupID),];
##           Date      Data groupID
## 1   2015-01-01 1.2199835      12
## 1.1 2015-01-01 1.2199835      12
## 3   2015-01-03 1.8141556      16
## 4   2015-01-04 0.2748579      24
## 5   2015-01-05 3.2030200      35
## 5.1 2015-01-05 3.2030200      35

(请注意,Data 列是不同的,因为您使用 rnorm() 生成它而没有先调用 set.seed()。建议在任何包含随机性的代码示例中调用 set.seed(),以便准确的结果可以被复制。)

【讨论】:

  • 谢谢 - 这正是我想要的:)
【解决方案2】:

您可以将BB 转换为data.frame 并使用merge()DFBB 根据他们的BB 合并,具体如下:

dates=seq(as.POSIXct("2015-01-01 00:00:00"), as.POSIXct("2015-01-07 00:00:00"), by="day")
groupID=c(12,14,16,24,35,46,54)
set.seed(1234)
data=rnorm(7,1,2)
DF=data.frame(Date=dates,Data=data,groupID=groupID)
BB=data.frame(groupID=c(12,12,16,24,35,35))

测试结果:

>merge(DF,BB,by="groupID")
  groupID       Date      Data
1      12 2015-01-01 -1.414131
2      12 2015-01-01 -1.414131
3      16 2015-01-03  3.168882
4      24 2015-01-04 -3.691395
5      35 2015-01-05  1.858249
6      35 2015-01-05  1.858249

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-21
    • 2016-09-09
    • 2023-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多