R-根据条件为数据帧中的每对删除一对行中的一行
我正在编写一个脚本来处理数据,需要从数据集中删除一对行中的一行。在下面的示例中,我希望保持第一稀释度,如果低于20000,则第一稀释度始终小于第二稀释度,但如果第一稀释度超过20000,则选择第二稀释度,无论第二稀释度是什么。确切的稀释度值因数据集而异,但每个患者的稀释度永远不会超过两次,因此我始终希望首先检查最低稀释度,以保持20000的阈值不变。此外,该数据集包含许多包含元数据的列R-根据条件为数据帧中的每对删除一对行中的一行,r,R,我正在编写一个脚本来处理数据,需要从数据集中删除一对行中的一行。在下面的示例中,我希望保持第一稀释度,如果低于20000,则第一稀释度始终小于第二稀释度,但如果第一稀释度超过20000,则选择第二稀释度,无论第二稀释度是什么。确切的稀释度值因数据集而异,但每个患者的稀释度永远不会超过两次,因此我始终希望首先检查最低稀释度,以保持20000的阈值不变。此外,该数据集包含许多包含元数据的列 Patient Dilution Value John 2 30000
Patient Dilution Value
John 2 30000
John 20 15000
George 2 13000
George 20 700
Kelly 2 49000
Kelly 20 24000
Tom 2 80000
Tom 20 30000
Diane 2 700
Diane 20 0
Patient Dilution Value
John 20 15000
George 2 13000
Kelly 20 24000
Tom 20 30000
Diane 2 700
如果你想看看我的代码的其余部分,是的,我是一个noob
###SA Summary
sadf <- merge(mydata, elisadata, "Description", all.x = TRUE)
sadf <- sadf[grep("X", sadf$Type),]
sadf <- sadf[-grep("Blank", sadf$Name),]
sadf <- sadf[-grep("MulV", sadf$Name),]
sadf <- sadf[,c("Isotype","Name","Description","Dilution.x","FI-Bkgd-Neg","Error","Conc..ug.ml.")]
sadf$Error <- as.character(sadf$Error)
sadf$Error[sadf$Conc..ug.ml. < 0.05] <- "LC"
sadf$Conc..ug.ml. <- ifelse(!is.na(sadf$Conc..ug.ml.) & sadf$Conc..ug.ml. < 0.05, NA, sadf$Conc..ug.ml.)
sadf$SA <- with(sadf, sadf$`FI-Bkgd-Neg` * sadf$Dilution.x / sadf$Conc..ug.ml.)
sadf$SA[sadf$SA < 0.02] <- 0.02
if (unique(sadf$Dilution) > 1) {} ###Where I need to put the answer to the question
sadf$`FI-Bkgd-Neg` <- NULL
sadf$Error[is.na(sadf$Error)] <- 0
sadf$Conc..ug.ml.[is.na(sadf$Conc..ug.ml.)] <- 0
sadf <- reshape(sadf, idvar = c("Description","Dilution.x","Isotype","Error","Conc..ug.ml."), timevar = "Name", direction = "wide")
sadf$Error[sadf$Error = 0] <- NA
sadf$Conc..ug.ml.[sadf$Conc..ug.ml. = 0] <- NA
使用dplyr,按患者分组,然后过滤到满足条件的按患者分组的行。如果第一个值超过20000,则条件返回最后一个值,否则返回最小值
注意:此方法遵循问题的措辞,不会返回问题中产生的data.frame。如果条件假设返回第一稀释度(如果低于20000),则您需要做的就是将min更改为first,然后从问题中获得结果数据框:
df %>% group_by(Patient) %>% filter(Value == ifelse(first(Value) > 20000,
last(Value),
first(Value)))
# Source: local data frame [5 x 3]
# Groups: Patient [5]
#
# Patient Dilution Value
# (fctr) (int) (int)
# 1 John 20 15000
# 2 George 2 13000
# 3 Kelly 20 24000
# 4 Tom 20 30000
# 5 Diane 2 700
使用dplyr,按患者分组,然后过滤到满足条件的按患者分组的行。如果第一个值超过20000,则条件返回最后一个值,否则返回最小值
注意:此方法遵循问题的措辞,不会返回问题中产生的data.frame。如果条件假设返回第一稀释度(如果低于20000),则您需要做的就是将min更改为first,然后从问题中获得结果数据框:
df %>% group_by(Patient) %>% filter(Value == ifelse(first(Value) > 20000,
last(Value),
first(Value)))
# Source: local data frame [5 x 3]
# Groups: Patient [5]
#
# Patient Dilution Value
# (fctr) (int) (int)
# 1 John 20 15000
# 2 George 2 13000
# 3 Kelly 20 24000
# 4 Tom 20 30000
# 5 Diane 2 700
我们可以使用data.table。将“data.frame”转换为“data.table”setDTdf,按“Patient”分组,我们使用if/else条件以最小值“Value”对行进行子集化,如果存在else,则获取最后一行
我们可以使用data.table。将“data.frame”转换为“data.table”setDTdf,按“Patient”分组,我们使用if/else条件以最小值“Value”对行进行子集化,如果存在else,则获取最后一行
我认为你这里有一个错误,稀释应该是值,稀释变量只有2和20,我们可以看到。刚刚编辑;我看错了问题,然后试图太快地修正我的答案。这很好,很简单,谢谢!我的意思是,如果稀释度低于20000,则返回第一稀释度。我称之为最低,因为它总是比最后一次稀释的数值小,可能不符合顺序,但我明白这是多么令人困惑。在这个例子中,第一次稀释对任何患者都不小。如果稀释列确实给出了稀释顺序,但它们不一定是有序的,那么最好用它来索引,而不是用第一个和最后一个。或者,你可以在链中插入一个排列,这样它就会有序。我认为你这里有一个错误,稀释应该是值,稀释变量只有2和20;我看错了问题,然后试图太快地修正我的答案。这很好,很简单,谢谢!我的意思是,如果稀释度低于20000,则返回第一稀释度。我称之为最低,因为它总是比最后一次稀释的数值小,可能不符合顺序,但我明白这是多么令人困惑。在这个例子中,第一次稀释对任何患者都不小。如果稀释列确实给出了稀释顺序,但它们不一定是有序的,那么最好用它来索引,而不是用第一个和最后一个。或者,你可以在链中丢弃一个排列,这样它就会有序。从你的结果数据.frame,我想你的意思是如果第一稀释度低于20000…,而不是最低。从你的结果数据.frame,我想你的意思是如果第一稀释度低于20000…,而不是最低。谢谢你,这太棒了!我的意思是第一次稀释,但第一次稀释的数值总是比第二次稀释的数值小,但它们可能不符合顺序,所以我想我会用你的第一个例子来代替mindilution。谢谢你,这太棒了!我的意思是第一次稀释,但是第一次稀释的数值总是比第二次稀释的数值小,但是它们可能不符合顺序,所以我想我会用你的第一个例子来代替mindilution。
setDT(df1)[df1[ , .I[if(min(Value) <20000)
which.min(Value) else .N] , Patient]$V1]
# Patient Dilution Value
#1: John 20 15000
#2: George 20 700
#3: Kelly 20 24000
#4: Tom 20 30000
#5: Diane 20 0
setDT(df1)[df1[ , .I[if(Value[1L] <20000)
1 else .N], Patient]$V1]
# Patient Dilution Value
#1: John 20 15000
#2: George 2 13000
#3: Kelly 20 24000
#4: Tom 20 30000
#5: Diane 2 700