用于评估数据框中具有不同名称的列的函数

时间:2016-02-08 18:08:15

标签: r function

我有一个数据框(总数)如下:

            ID      pos  ori cont mA1 nmA1 bdA1 mA2 nmA2 bdA2 mB1 nmB1 bdB1 mB2
         1: ChrM      5   +  CCG   0    1    2   0    1    2   0    4    5   0
         2: ChrM      6   +  CGT   0    1    2   2    0    0   2    2    2   1
         3: ChrM      7   -  CGG   0    1    2   0    6    7   0    3    4   1
         4: ChrM     10   +  CGA   0    2    3   2    1    2   2    3    2   1
         5: ChrM     11   -  CGA   0    1    2   2    6    2   0    3    4   1
        ---                                                                   
    164264: ChrM 366914   +  CAA   0    1    2   0    2    3   0    1    2   0
    164265: ChrM 366918   +  CCG   0    1    2   0    2    3   0    0    1   0
    164266: ChrM 366919   +  CGG   0    1    2   0    2    3   0    0    1   0
    164267: ChrM 366920   -  CGG   1    2    2   0    5    6   0    1    2   0
    164268: ChrM 366921   -  CCG   0    3    4   0    3    4   0    0    1   0
            nmB2 bdB2
         1:    5    6
         2:    6    3
         3:    3    2
         4:    7    3
         5:    8    3
        ---          
    164264:    8    9
    164265:    7    8
    164266:    7    8
    164267:    4    5
    164268:    4    5

我想要一个功能来评估几个标准。当我一个接一个地使用

total$critA <- as.numeric((total$mA1+total$nmA1>=4)&(total$nmA1>=bdA1))

所以如果为真,我得到0,如果为假则得到1。我想将它应用于所有治疗(A1(m,nm和bd),A2,A3等)。

我对R来说真的很陌生,并且还没有想出如何做一堆东西,所以任何帮助都非常感谢。谢谢!

1 个答案:

答案 0 :(得分:0)

我认为是这样的:(如果您与dput共享数据我会复制/粘贴它并测试... see here以获取有关编写良好,可重现的R问题的其他提示。

add_crit = function(data, treatment) {
    m_name = paste0("m", treatment)
    nm_name = paste0("nm", treatment)
    bd_name = paste0("bd", treatment)
    crit_name = paste0("crit", treatment)

    data[crit_name] = as.numeric(
      (data[m_name] + data[nm_name] >= 4) & (data[nm_name] >= data[bd_name])
    )
    return(data)
}

treatments = c("A1", "A2", "B1", "B2")
data_with_crit = total

for (trt in treatments) {
    data_with_crit = add_crit(data_with_crit, trt)
}

我使用paste将您需要的列名称构建为字符串。当列名存储在变量中时,您需要使用[而不是$,否则它们也可以正常工作。

fortunes::fortune(343)
  

大多数R初学者迟早都被这个太方便的捷径所咬。作为R新手,       将R视为您的银行帐户:过度使用$ - 提取可能会导致不良后果。       最好早点获得'[[''['习惯。           - Peter Ehlers(关于$ -extraction的使用)             R-help(2013年3月)

处理这个问题的另一种(更普遍的)方式是&#34;融化&#34;您的数据格式为长格式 - 您将拥有一个treatment列,其值为A1, A2, ...,然后是mnmbd,{{1 }}。每个id多行(每个id每个处理一行)。这将适用于critdata.table解决方案。也许其他人会发布一个例子。