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
现在我想检索 V1 的所有 values/pairs,其中它没有相应的值,不是 V2 上的 X。在上面的数据集中,这个子集是
HIJ P 40
HIJ Y 41
因为这对 HIJ 都没有 X 的 V2 值。
我还想检索 V1 的所有不重复两次的值。在上面的示例中,它将是
PKL X 32
假设您的数据位于名为 foo
的 data.frame
中。
对于1.我喜欢by()
。 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
对于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)
我想知道如何在 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
现在我想检索 V1 的所有 values/pairs,其中它没有相应的值,不是 V2 上的 X。在上面的数据集中,这个子集是
HIJ P 40 HIJ Y 41
因为这对 HIJ 都没有 X 的 V2 值。
我还想检索 V1 的所有不重复两次的值。在上面的示例中,它将是
PKL X 32
假设您的数据位于名为 foo
的 data.frame
中。
对于1.我喜欢by()
。 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
对于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)