2016-02-08 45 views
0

我有一个数据帧(总)内评估不同名称的列:功能像这样一个数据帧

  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等)

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

+0

欢迎来到计算器!查看“应用”系列功能:https://nsaunders.wordpress.com/2010/08/20/a-brief-introduction-to-apply-in-r/ – Chris

+0

此外,只要确保您知道您会如果为True,则为1;如果为False,则为0(反之亦然,如您在您的问题中所述)。 – Gregor

+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作为您的银行账户:过度使用$ - 提取可能导致不良后果。 最好尽早获得'[[''['的习惯。 - 彼得·埃勒斯(约使用-extraction $) R-帮助(2013年3月)

其他(更一般化)的方式来处理这个问题。将“融化”你的数据转化为长格式 - 您将有一个treatment列,其值为A1, A2, ...,然后单列为m,nm,bd,crit。每个ID多行(每个ID每个治疗一行)。这将适用于data.tabledplyr解决方案。也许别人会发表一个例子。

+0

感谢您的帮助! –