簡體   English   中英

對於所有ID均大於零的ID,刪除ID等於零的行。

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM