R如何从具有多个条件的data.frame中检索数据

时间:2015-04-29 13:24:51

标签: r dataframe subset

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

我有一个包含以下模式的数据表:

  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的所有值/对,它不具有V2上不是X的对应值。在上面的数据集中,这个子集将是

    HIJ     P    40
    HIJ     Y    41
    
  2. 由于这两对HIJ都没有V2值为X。

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

      PKL  X 32
      

3 个答案:

答案 0 :(得分:8)

您提到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

答案 1 :(得分:3)

如果您决定使用dplyr

,也可以使用data.frame
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)

答案 2 :(得分:2)

假设您的数据位于名为data.frame的{​​{1}}。

对于1.我喜欢fooby() by的所有条目都会V1查看"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

For 2.这更简单:

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