[英]Remove ID's which have a zero value in more than “n” time points with dplyr R
[英]Remove the row with ID equals zero for all the ID's having values greater than zero.
我有一個這樣的數據框
ID <- c("A","A","A","B","B","C","D")
Value <- c(0,1,2,0,2,0,0)
df <- data.frame(ID,Value)
df
我正在嘗試應用以下邏輯:如果任何ID的值都大於0,則需要刪除ID的該行,並將其設為0。
我想要的輸出是
ID Value
A 1
A 2
B 2
C 0
D 0
我嘗試這樣做
df <- subset(df,df$Value !=0)
我知道這是錯誤的,因為它會刪除任何帶有0的ID。請提供一些有關如何解決此問題的幫助
您可以使用ave()
,首先將“ Value
列強制為邏輯,以使輸出結果成為子集的向量。 我們使用if()
語句確定要保留的值。
df[with(df, ave(as.logical(Value), ID, FUN = function(x) if(any(x)) x else !x)), ]
# ID Value
# 2 A 1
# 3 A 2
# 5 B 2
# 6 C 0
# 7 D 0
或與subset()
相同。
subset(df, ave(as.logical(Value), ID, FUN = function(x) if(any(x)) x else !x))
# ID Value
# 2 A 1
# 3 A 2
# 5 B 2
# 6 C 0
# 7 D 0
香草方式:
# get ids with values greater than 0
delete_zero = unique(subset(df, Value > 0)$ID)
# delete the rows where the ID is in delete_zero AND the value is 0
df2 = subset(df, !(ID %in% delete_zero & Value == 0))
df2
# ID Value
# 2 A 1
# 3 A 2
# 5 B 2
# 6 C 0
# 7 D 0
新的方式:相同的邏輯,但我們使用dplyr
“按組”進行操作
library(dplyr)
df %>% group_by(ID) %>%
filter(!(any(Value > 0) & Value == 0))
# Source: local data frame [5 x 2]
# Groups: ID [4]
#
# ID Value
# <fctr> <dbl>
# 1 A 1
# 2 A 2
# 3 B 2
# 4 C 0
# 5 D 0
dplyr
方法:
library(dplyr)
df %>% group_by(ID) %>% filter(if (all(Value==0)) TRUE else Value > 0)
Source: local data frame [5 x 2]
Groups: ID [4]
ID Value
<fctr> <dbl>
1 A 1
2 A 2
3 B 2
4 C 0
5 D 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.