使用 dplyr R 删除在超过 "n" 个时间点中具有零值的 ID
Remove ID's which have a zero value in more than "n" time points with dplyr R
我的数据框是这样的
value <- c(0,0.1,0.2,0.4,0,0.05,0.05,0.5,0.20,0.40,0.50,0.60)
time <- c(0,0,0,0,1,1,1,1,2,2,2,2)
ID <- c(1,2,3,4,1,2,3,4,1,2,3,4)
test <- data.frame(value, time, ID)
test
value time ID
1 0.00 0 1
2 0.10 0 2
3 0.20 0 3
4 0.40 0 4
5 0.00 1 1
6 0.05 1 2
7 0.05 1 3
8 0.50 1 4
9 0.20 2 1
10 0.40 2 2
11 0.50 2 3
12 0.60 2 4
我想删除所有大于或等于两个时间点的值==0 的 ID
我希望我的数据框看起来像这样,(删除 ID=1 有两个时间点值=0)
2 0.10 0 2
3 0.20 0 3
4 0.40 0 4
6 0.05 1 2
7 0.05 1 3
8 0.50 1 4
10 0.40 2 2
11 0.50 2 3
12 0.60 2 4
我们可以将 filter
与逻辑条件一起使用,方法是使用 sum
获取表达式 value == 0
的计数,然后将其转换为小于 2 的逻辑条件(分组后通过 'ID')
library(dplyr)
test %>%
group_by(ID) %>%
filter(sum(value == 0) <2)
在基础 R 中,我们可以使用 subset
和 ave
:
n <- 2
subset(test, ave(value == 0, ID, FUN = sum) < n)
# value time ID
#2 0.10 0 2
#3 0.20 0 3
#4 0.40 0 4
#6 0.05 1 2
#7 0.05 1 3
#8 0.50 1 4
#10 0.40 2 2
#11 0.50 2 3
#12 0.60 2 4
或在 data.table
中:
library(data.table)
setDT(test)[, .SD[sum(value == 0) < n], ID]
我的数据框是这样的
value <- c(0,0.1,0.2,0.4,0,0.05,0.05,0.5,0.20,0.40,0.50,0.60)
time <- c(0,0,0,0,1,1,1,1,2,2,2,2)
ID <- c(1,2,3,4,1,2,3,4,1,2,3,4)
test <- data.frame(value, time, ID)
test
value time ID
1 0.00 0 1
2 0.10 0 2
3 0.20 0 3
4 0.40 0 4
5 0.00 1 1
6 0.05 1 2
7 0.05 1 3
8 0.50 1 4
9 0.20 2 1
10 0.40 2 2
11 0.50 2 3
12 0.60 2 4
我想删除所有大于或等于两个时间点的值==0 的 ID 我希望我的数据框看起来像这样,(删除 ID=1 有两个时间点值=0)
2 0.10 0 2
3 0.20 0 3
4 0.40 0 4
6 0.05 1 2
7 0.05 1 3
8 0.50 1 4
10 0.40 2 2
11 0.50 2 3
12 0.60 2 4
我们可以将 filter
与逻辑条件一起使用,方法是使用 sum
获取表达式 value == 0
的计数,然后将其转换为小于 2 的逻辑条件(分组后通过 'ID')
library(dplyr)
test %>%
group_by(ID) %>%
filter(sum(value == 0) <2)
在基础 R 中,我们可以使用 subset
和 ave
:
n <- 2
subset(test, ave(value == 0, ID, FUN = sum) < n)
# value time ID
#2 0.10 0 2
#3 0.20 0 3
#4 0.40 0 4
#6 0.05 1 2
#7 0.05 1 3
#8 0.50 1 4
#10 0.40 2 2
#11 0.50 2 3
#12 0.60 2 4
或在 data.table
中:
library(data.table)
setDT(test)[, .SD[sum(value == 0) < n], ID]