R 如何在多个条件下从 data.frame 检索数据

R how to retrieve data from data.frame with multiple conditions

我想知道如何在 R 中执行一些基本的数据操作。我想做的是以下内容。

我有一个数据 table 具有以下模式:

  V1     V2     V3    
  ABC     X     24
  ABC     Y     30
  EFG     X     4
  EFG     Y     28
  HIJ     P     40
  HIJ     Y     41
  PKL     X     32
  1. 现在我想检索 V1 的所有 values/pairs,其中它没有相应的值,不是 V2 上的 X。在上面的数据集中,这个子集是

    HIJ     P    40
    HIJ     Y    41
    

因为这对 HIJ 都没有 X 的 V2 值。

  1. 我还想检索 V1 的所有不重复两次的值。在上面的示例中,它将是

    PKL  X 32
    

假设您的数据位于名为 foodata.frame 中。

对于1.我喜欢by()byV1的所有条目看"X"是否是%in%V2对应的条目。将其包装在 names()which().

hits <- names(which(with(foo,by(V2,V1,function(xx)!"X"%in%xx))))
foo[foo$V1 %in% hits,]
   V1 V2 V3
5 HIJ  P 40
6 HIJ  Y 41

对于2。这个更简单:

names(which(table(foo$V1)<2))
[1] "PKL"

您提到了 data.table,因此对于这两个请求,这里有两种可能的方法

library(data.table)

对于 1.

setDT(df)[, .SD[all(V2 != "X")], by = V1]
#     V1 V2 V3
# 1: HIJ  P 40
# 2: HIJ  Y 41

对于 2.

df[, .SD[.N == 1L], by = V1]
#     V1 V2 V3
# 1: PKL  X 32

或者(稍微优化一点的版本)

indx <- df[, .(indx = .I[.N == 1L]), by = V1]$indx
df[indx]
#     V1 V2 V3
# 1: PKL  X 32

如果您决定在 data.frame

上工作,您也可以使用 dplyr
library(dplyr)

# Problem 1
df %>% group_by(V1) %>% filter(all(V2 != "X"))

#    V1 V2 V3
# 1 HIJ  P 40
# 2 HIJ  Y 41

# Problem 2
df %>% group_by(V1) %>% filter(n() == 1)

#    V1 V2 V3
# 1 PKL  X 32

如果你的数据是

V1 <- c("ABC", "ABC", "EFG", "EFG", "HIJ", "HIJ", "PKL")
V2 <- c("X", "Y", "X", "Y", "P", "Y", "X")
V3 <- c(24,30,4,28,40,41,32)
df <- data.frame (V1,V2,V3)