R 保留符合特定条件的数据帧行
我创建了一个简单的data.frame:R 保留符合特定条件的数据帧行,r,dataframe,R,Dataframe,我创建了一个简单的data.frame: data.frame(a = rep(LETTERS[1:4], each=4), b = c(sample(6,4),sample(6,4),sample(6,4),sample(6,4))) a b 1 A 6 2 A 4 3 A 2 4 A 3 5 B 5 6 B 1 7 B 3 8 B 6 9 C 2 10 C 3 11 C 5 12 C 1 13 D 4 14 D 5 15 D 1 16 D 3
data.frame(a = rep(LETTERS[1:4], each=4),
b = c(sample(6,4),sample(6,4),sample(6,4),sample(6,4)))
a b
1 A 6
2 A 4
3 A 2
4 A 3
5 B 5
6 B 1
7 B 3
8 B 6
9 C 2
10 C 3
11 C 5
12 C 1
13 D 4
14 D 5
15 D 1
16 D 3
如何仅保留data.frame中b列中的数字出现在a列的所有4个字母中的那些行?例如,b列中的数字3出现在A列中的A、b、C和D中,因此应保留该数字。假设x是您的数据帧
keep <- apply( x, 1,
function( y ) all( LETTERS[1:4] %in% x[ x[,2] == y[2], 1 ] ) )
假设x是您的数据帧
keep <- apply( x, 1,
function( y ) all( LETTERS[1:4] %in% x[ x[,2] == y[2], 1 ] ) )
这里有一个稍微不同的方法,使用递归交集
set.seed(123)
df <- data.frame(a = rep(LETTERS[1:4], each=4),
b = c(sample(6,4),sample(6,4),sample(6,4),sample(6,4)))
with(df, df[b %in% Reduce(intersect, split(b, a)),])
a b
3 A 6
4 A 3
5 B 6
7 B 3
10 C 3
11 C 6
14 D 3
16 D 6
这里有一个稍微不同的方法,使用递归交集
set.seed(123)
df <- data.frame(a = rep(LETTERS[1:4], each=4),
b = c(sample(6,4),sample(6,4),sample(6,4),sample(6,4)))
with(df, df[b %in% Reduce(intersect, split(b, a)),])
a b
3 A 6
4 A 3
5 B 6
7 B 3
10 C 3
11 C 6
14 D 3
16 D 6
您还可以尝试使用表来帮助您子集:
set.seed(123)
df <- data.frame(a = rep(LETTERS[1:4], each=4),
b = c(sample(6,4), sample(6,4), sample(6,4), sample(6,4)))
df[df$b %in% which(colSums(table(df)) == length(unique(df$a))), ]
# a b
# 3 A 6
# 4 A 3
# 5 B 6
# 7 B 3
# 10 C 3
# 11 C 6
# 14 D 3
# 16 D 6
然后,匹配您想要的条件:
df[counts == 4, ]
# a b
# 3 A 6
# 4 A 3
# 5 B 6
# 7 B 3
# 10 C 3
# 11 C 6
# 14 D 3
# 16 D 6
您还可以尝试使用表来帮助您子集:
set.seed(123)
df <- data.frame(a = rep(LETTERS[1:4], each=4),
b = c(sample(6,4), sample(6,4), sample(6,4), sample(6,4)))
df[df$b %in% which(colSums(table(df)) == length(unique(df$a))), ]
# a b
# 3 A 6
# 4 A 3
# 5 B 6
# 7 B 3
# 10 C 3
# 11 C 6
# 14 D 3
# 16 D 6
然后,匹配您想要的条件:
df[counts == 4, ]
# a b
# 3 A 6
# 4 A 3
# 5 B 6
# 7 B 3
# 10 C 3
# 11 C 6
# 14 D 3
# 16 D 6
我也试过了,结果也一样。这也是一个很好的方法。谢谢!我也试过了,结果也一样。这也是一个很好的方法。谢谢!