【问题标题】:Assign a variable to a specific cell in a data frame, when the row position is dynamic当行位置是动态时,将变量分配给数据框中的特定单元格
【发布时间】:2020-03-27 12:40:47
【问题描述】:

这里的目标是自动化数据处理管道,我可以在其中读取 .csv 文件并运行脚本并输出处理后的文件,为数据绘图做好准备。我所做的只是对几列应用一些操作,但我不清楚自动化一个步骤:

我需要将一列中的值除以另一列中的值,但在除法之前,我需要从特定单元格中减去一个值。但是,在每个不同的 .csv 中,特定单元格的位置都会发生变化,因此我不能简单地将列/行单元格提取为变量并使用它。以数据框为例:

df<-

sampleid  t1    t2
a1        4     15
a2        3     18
a3        7     30
b1        6     17
blank     1     5

函数将是

df <- df %>% mutate(ri=(t1-1)/(t2-1))

从 t1 和 t2 中减去的“1”来自“空白”行的“t1”值。我想创建一个该单元格值的变量,以代入该方程(有时它不是 1)。 csv/data 框中的特定行会根据总样本数而变化,所以我不能每次都选择一个固定的单元格。

理想情况下就是

df <- df %>% mutate(ri=(t1-x)/(t2-x))

其中“x”被分配给数据框中的空白 t1 值。

有什么好的方法可以做到这一点吗?谢谢。

【问题讨论】:

    标签: r dataframe dplyr


    【解决方案1】:

    您可以将变量 x 添加为列,然后使用您的公式(然后再次删除 x):

    library(tidyverse)
    
    df <- read.table(text = "sampleid  t1    t2
    a1        4     15
    a2        3     18
    a3        7     30
    b1        6     17
    blank     1     5", header = TRUE, stringsAsFactors = FALSE)
    
    df %>%
      mutate(x = df %>%
               filter(sampleid == "blank") %>%
               pull(t1)) %>%
      mutate(ri = (t1 - x) / (t2 - x)) %>%
      select(-x)
    
    # sampleid t1 t2        ri
    # 1       a1  4 1 0.2142857
    # 2       a2  3 1 0.1176471
    # 3       a3  7 1 0.2068966
    # 4       b1  6 1 0.3125000
    # 5    blank  1 1 0.0000000
    

    【讨论】:

      【解决方案2】:

      你可以使用match

      library(dplyr)
      df %>% mutate(ri = {val = t1[match('blank', sampleid)];(t1- val)/(t2-val)})
      
      #  sampleid t1 t2     ri
      #1       a1  4 15 0.2143
      #2       a2  3 18 0.1176
      #3       a3  7 30 0.2069
      #4       b1  6 17 0.3125
      #5    blank  1  5 0.0000
      

      如果您只有一个 'blank' 值,其他变体可能与 which.maxwhich'==' 一起使用

      df %>% mutate(ri = {val = t1[which.max(sampleid == 'blank')];(t1- val)/(t2-val)})
      
      df %>% mutate(ri = {val = t1[which(sampleid == 'blank')[1]];(t1- val)/(t2-val)})
      
      df %>% mutate(ri = {val = t1[sampleid == 'blank'];(t1- val)/(t2-val)})
      

      您可以在基础 R 中使用相同的 transform

      transform(df, ri = {val = t1[which.max(sampleid == 'blank')];(t1- val)/(t2-val)})
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-04
        • 2018-07-05
        相关资源
        最近更新 更多