r子集并从data.frame中的其他列中减去一列

时间:2017-11-10 23:49:57

标签: r function

我想知道是否有人可以帮我编写一个函数来执行此操作。我有一个类似于以下内容的数据框:

df <- data.frame(TestA1 = c(1,2), TestA2 = c(2,3), TestB1 = c(3,4), TestB2 = c(5,6), A = c(1,1), B = c(2,2))
df
TestA1 TestA2 TestB1 TestB2 A B
1      2      3      5 1 2
2      3      4      6 1 2

我想减去&#34; A&#34;所有其他列中的列,名称中包含A(即TestA1和TestA2),并对B及其匹配列执行相同操作。在一个功能中尝试和做这个太多了吗?

我还是R的新手,我一直在我的数据集上做这个操作,看起来非常低效(完整的数据集是25000x55)。我一直试图围绕如何编写一个功能来完成它并且一直在努力。任何帮助/指导将不胜感激!

修改

理想情况下,输出为(如果选择B)

NewTestB1  NewTestB2
1          3
2          4

因此,B = c(2,2)将从匹配的每一列中减去,从而产生一个输出数据帧,该输出数据帧由已选择的列和附加调整组成。

1 个答案:

答案 0 :(得分:0)

在基础R中,提供您想要的功能:

myF <- function( object, selector )
{
    ix <- which( grepl( selector, colnames( object ) ) & colnames( object ) != selector )
    rowSums( object[ ix ] ) - object[ selector ]
}

所以电话

myF( df, "B" ) 

会给你

  B
1 6
2 8

这是基于你当然简化的样本,可能需要一些调整。您可能还想重命名返回的data.frame,但这一切都取决于您对结果的进一步使用。

如果您想要一个向量而不是一列data.frame,请更改为

rowSums( object[ ix ] ) - object[ selector ][ , 1 ]

编辑:

这可能是你想要的:

myF <- function( object, selector )
{
    ix <- which( grepl( selector, colnames( object ) ) & colnames( object ) != selector )
    for( i in ix )
        object[ length( object ) + 1 ] <- object[ i ] - object[ selector ]
    return( object )
}

这会给你

myF( df, "B" )
  TestA1 TestA2 TestB1 TestB2 A B TestB1.1 TestB2.1
1      1      2      3      5 1 2        1        3
2      2      3      4      6 1 2        2        4

可能会进行一些改进,例如更好的列名等,但功能已实现。此外,请注意,这不会更改原始data.frame,但会为您提供更新的副本。

第二次编辑,删除列:

myF <- function( object, selector )
{
    ix <- which( grepl( selector, colnames( object ) ) & colnames( object ) != selector )
    for( i in ix )
        object[ length( object ) + 1 ] <- object[ i ] - object[ selector ]
    object <- object[ -ix ]
    object <- object[ -(which( colnames( object ) == selector ) ) ]
    return( object )
}
制造

myF( df, "B" )
  TestA1 TestA2 A TestB1.1 TestB2.1
1      1      2 1        1        3
2      2      3 1        2        4