我想知道如何在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
现在我想要检索V1的所有值/对,它不具有V2上不是X的对应值。在上面的数据集中,这个子集将是
HIJ P 40
HIJ Y 41
由于这两对HIJ都没有V2值为X。
我还想检索不重复两次的V1的所有值。在上面的例子中,它将是
PKL X 32
答案 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.我喜欢foo
。 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
For 2.这更简单:
names(which(table(foo$V1)<2))
[1] "PKL"