我想知道是否有人可以帮我编写一个函数来执行此操作。我有一个类似于以下内容的数据框:
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)将从匹配的每一列中减去,从而产生一个输出数据帧,该输出数据帧由已选择的列和附加调整组成。
答案 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