【问题标题】:R - How to create a new column in a dataframe with calculations based on condition of another columnR - 如何在数据框中创建一个新列,并根据另一列的条件进行计算
【发布时间】:2019-11-29 04:16:55
【问题描述】:

在一个项目中,我在 CT 扫描仪中测量了不同偏离中心位置(列=Offcenter)(工作台高度)的肿瘤碘浓度(列=ROI_IC)。我知道每个肿瘤的真实浓度(列=Real_IC;有 4 种不同的肿瘤具有 4 种不同的 real_IC 浓度)。每个肿瘤在每个偏离中心的位置测量 10 次(列=Measurement_repeat)。我计算了测得的碘浓度和实际碘浓度之间的绝对误差(column=absError_IC)

这只是数据的头部:

Offcenter Measurement_repeat Real_IC ROI_IC absError_IC 1 0 1 0.0 0.4 0.4 2 0 2 0.0 0.3 0.3 3 0 3 0.0 0.3 0.3 4 0 4 0.0 0.0 0.0 5 0 5 0.0 0.0 0.0 6 0 6 0.0 -0.1 0.1 7 0 7 0.0 -0.2 0.2 8 0 8 0.0 -0.2 0.2 9 0 9 0.0 -0.1 0.1 10 0 10 0.0 0.0 0.0 11 0 1 0.4 0.4 0.0 12 0 2 0.4 0.3 0.1 13 0 3 0.4 0.2 0.2 14 0 4 0.4 0.0 0.4 15 0 5 0.4 0.0 0.4 16 0 6 0.4 -0.1 0.5 17 0 7 0.4 0.1 0.3 18 0 8 0.4 0.3 0.1 19 0 9 0.4 0.6 0.2 20 0 10 0.4 0.7 0.3

现在我想创建一个名为 corrError_IC 的新列。
在此列中,测得的碘浓度 (ROI_IC) 应根据在 Offcenter = 0 处针对特定 Real_IC 浓度发现的平均绝对误差(10 次测量的平均值)进行校正

因为有 4 个肿瘤浓度,所以在偏离中心 =0 处有 4 个平均值,我想将其应用于其他偏离中心值。

mean1=mean of the 10 absError-IC measurements of the `Real_IC=0`

mean2=mean of the 10 absError-IC measurements of the `Real_IC=0.4`

mean3=mean of the 10 absError-IC measurements of the `Real_IC=3`

mean4=mean of the 10 absError-IC measurements of the `Real_IC=5`

基本上,我希望特定肿瘤的平均绝对误差为Offcenter = 0(有 4 种不同的肿瘤类型和四种不同的 Real_IC),然后我想通过这个绝对误差值校正其他偏心位置的所有肿瘤源自Offcenter = 0 数据。

我尝试了ifelse 语句,但我无法弄清楚。

编辑: 偏心有特定级别:c(-6,-4,-3,-2,-1,0,1,2,3,4,6)

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    这是我将如何解决这个问题。

    1. 计算按Real_IC分组的absError_IC的平均值。
    2. 用分组平均值左连接原始 data.frame

    代码示例

    ## replicate sample data sets
    ROI_IC = c(0.4, 0.3, 0.3, 0.0, 0.0, -0.1, -0.2, -0.2, -0.1, 0.0, 
               0.4, 0.3, 0.2, 0.0, 0.0, -0.1, 0.1, 0.3, 0.6, 0.7)
    df = data.frame("Offcenter"=rep(0, 40),
                    "Measurement_repeat"=rep( c(1:10), 4),
                    "Real_IC"=rep( c(0,0.4,3,5), each=10), 
                    "ROI_IC"=rep(ROI_IC, 2), 
                    stringsAsFactors=F)
    df$absError_IC = abs(df$Real_IC - df$ROI_IC)
    
    ## compute mean of "absError_IC" grouped by "Real_IC"
    mean_values = aggregate(df[df$Offcenter==0, c("absError_IC")], 
                            by=list("Real_IC"=df$Real_IC),
                            FUN=mean)
    names(mean_values)[which(names(mean_values)=="x")] = "MAE"
    
    ## left join to append column
    df = merge(df, mean_values, by.x="Real_IC", by.y="Real_IC", all.x=T, all.y=F, sort=F)
    ## notice that column order shifts based on "key"
    df[c(1:5, 10:15), ]
    

    我建议使用data.table 包,它在需要处理大量数据时特别有用。

    library(data.table)
    ## dt = data.table(df) or dt = fread(<path>)
    ## dt[dt$Offcenter==0, c("absError_IC") := abs(dt$Real_IC - dt$ROI_IC)]
    
    ## compute grouped mean
    mean_values = dt[, j=list("MAE"=mean(absError_IC)), by=list(Real_IC)]
    
    ## left join
    dt = merge(dt, mean_values, by.x="Real_IC", by.y="Real_IC", all.x=T, all.y=F, sort=F)
    

    【讨论】:

    • 感谢您的回答和帮助。我不确定这是否符合我的意图,但这可能是因为我无法正确解释它。我想计算对应于 Offcenter = 0 的 4 个不同 Real_IC 级别的 Real_IC-ROI-IC 的平均 absError。然后我想使用这些 absErrors 来“纠正”所有其他 Offcenter 级别的 ROI_IC。然而,这些应该与 Real_IC 级别相匹配。我有多次重复我的实验设置(偏心级别),始终使用相同的 4 个 Real_IC。我想纠正其他偏心级别的 ROI
    • @user7937045 "absError(Real_IC, ROI-IC)" 由不同的 Real_IC 级别计算并添加到df。然后,通过“df$corrROI_IC = df$ROI_IC - df$MAE”更正 Real_IC。还编辑了聚合部分,仅考虑 Offcenter = 0 的 IC 级别。
    【解决方案2】:

    我找到了一种方法来计算我想要的结果,方法是创建一个额外的列,获取 Off-center = 0 的 4 个 Real_IC 级别的平均绝对误差,并在 Real_IC 具有特定级别时匹配它们。 第二步,我从 ROI_IC 中减去这些。但是,如何将该代码简化为更通用的形式(目前我根据它们的行位置计算平均 absErrors)?对不起,我是一个绝对的初学者;(

    注意:我的 data.frame 被称为“ds_M”

    #Define absolute errors for the 4 Real_IC levels as variables
    
    average1<-mean(ds_M$absError_IC[1:10]) #for Real_IC=0
    average2<-mean(ds_M$absError_IC[11:20]) #for Real_IC=0.4
    average3<-mean(ds_M$absError_IC[21:30]) #for Real_IC=3
    average4<-mean(ds_M$absError_IC[31:40]) #for Real_IC=5
    
    # New column assigning the correction factor to each Real_IC level
    ds_M$absCorr[ds_M$Real_IC==0]<-average1
    ds_M$absCorr[ds_M$Real_IC==0.4]<-average2
    ds_M$absCorr[ds_M$Real_IC==3]<-average3
    ds_M$absCorr[ds_M$Real_IC==5]<-average4
    
    # Calculate new column with corrected ROI_ICs
    ds_M$corrError_IC<-ds_M$ROI_IC - ds_M$absCorr
    

    【讨论】:

      【解决方案3】:

      考虑 ave 用于内联聚合,其中它的第一个参数是数字量字段,下一个参数是分组字段,最后一个需要命名参数 FUN 的参数是数字函数:ave(num_vector, ..., FUN=func)

      df$corrError_IC <- with(df, ave(absError_IC, Real_IC, FUN=mean))
      

      要处理 NA,请扩展 na.rm 参数的函数参数:

      df$corrError_IC <- with(df, ave(absError_IC, Real_IC, FUN=function(x) mean(x, na.rm=TRUE))
      

      【讨论】:

        猜你喜欢
        • 2021-11-16
        • 1970-01-01
        • 1970-01-01
        • 2018-08-08
        • 2021-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-14
        相关资源
        最近更新 更多