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