簡體   English   中英

按值過濾行,除非沒有行滿足條件

[英]Filter rows by value unless no row meet condition

在 R 我有以下數據集,如果 Per<98,我想刪除行,除非 A 中沒有具有相同值的行滿足此條件(然后添加 0):

df <- cbind(c("D1", "D1", "D1", "D1", "D2", "D2", "D2", "D2", "D3", "D3", "D3", "D3"), c(99.8, 99.5, 98.7, 98, 97.8, 97.3, 96, 95.9, 95, 94.9, 94.5, 94), c("sp", "sp", "sp", "sp", "sp", "sp", "sp", "sp", "sp", "sp", "sp", "sp")) colnames(df) <- cbind("A", "Per", "B")

預期的結果是

df <- cbind(c("D1", "D1", "D1", "D1", "D2", "D3"), c(99.8, 99.5, 98.7, 98, 0, 0), c("sp", "sp", "sp", "sp", "sp", "sp")) colnames(df) <- cbind("A", "Per", "B")

這應該可以解決問題。

library(dplyr)
df2=as.data.frame(df, stringsAsFactors=FALSE) %>% mutate(Per=as.numeric(Per))
j=1
for (i in 1:nrow(df2)) {
  print(i)
  if ((sum(df2$A==df2[j,"A"])==1) & (df2[j,"Per"]<98)) {
    df2[j, "Per"]=0
  } else if (df2[j,"Per"] < 98) {
    df2=df2[-j,]
    next
  }
  j=j+1
}
df2

    A  Per  B
1  D1 99.8 sp
2  D1 99.5 sp
3  D1 98.7 sp
4  D1 98.0 sp
8  D2  0.0 sp
12 D3  0.0 sp

如果它需要是一個矩陣,

df2=as.matrix(df2)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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