Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R-根据条件为数据帧中的每对删除一对行中的一行_R - Fatal编程技术网

R-根据条件为数据帧中的每对删除一对行中的一行

R-根据条件为数据帧中的每对删除一对行中的一行,r,R,我正在编写一个脚本来处理数据,需要从数据集中删除一对行中的一行。在下面的示例中,我希望保持第一稀释度,如果低于20000,则第一稀释度始终小于第二稀释度,但如果第一稀释度超过20000,则选择第二稀释度,无论第二稀释度是什么。确切的稀释度值因数据集而异,但每个患者的稀释度永远不会超过两次,因此我始终希望首先检查最低稀释度,以保持20000的阈值不变。此外,该数据集包含许多包含元数据的列 Patient Dilution Value John 2 30000

我正在编写一个脚本来处理数据,需要从数据集中删除一对行中的一行。在下面的示例中,我希望保持第一稀释度,如果低于20000,则第一稀释度始终小于第二稀释度,但如果第一稀释度超过20000,则选择第二稀释度,无论第二稀释度是什么。确切的稀释度值因数据集而异,但每个患者的稀释度永远不会超过两次,因此我始终希望首先检查最低稀释度,以保持20000的阈值不变。此外,该数据集包含许多包含元数据的列

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