在两行上调用类似应用的函数以进行匹配

时间:2018-09-20 13:56:56

标签: r dataframe lapply

我有一个包含多行的数据框。我想调用一个函数使用任何两行。例如,假设我有此数据和接受两个参数的myFunc:

df <- data.frame(q1=c(1,2,5), q2=c(5,5,5), q3=c(5,2,5), q4=c(5,5,5), q5=c(2,3,1))  
df  
   q1  q2  q3  q4  q5  
1   1   5   5   5   2  
2   2   5   2   5   3  
3   5   5   5   5   1  

myFunc<-function(a,b) sum((df[a,]==df[b,] & df[a,]==5)*1)

我想对第1行和第2行应用myFunc,myFunc(1,2),我希望2,myFunc计算在第1行和第2行之间同一列下共有多少个“ 5”。

由于我有成千上万的行,并且我想匹配所有对,所以我希望不编写for循环就可以这样做,也许可以使用do调用或Apply函数族。

我尝试过:

a=c(1,2)    # match the row 1 and 2    
b=c(2,3)    # match the row 2 and 3    
my_list=list(a,b)

do.call("myFunc", my_list)     

但是我有4个,而不是2个和2个,有什么想法吗?

2 个答案:

答案 0 :(得分:2)

尝试传递行而不是行索引

df <- data.frame(q1=c(1,2,5), q2=c(5,5,5), q3=c(5,2,5), q4=c(5,5,5), q5=c(2,3,1))  

myFunc<-function(a,b) sum((a==b & a==5)*1)

myFunc(df[1,],df[2,])

这对我有用(返回2)

答案 1 :(得分:2)

问题最近改变了。我对它的理解是,输入应该是行号对的列表,输出应该与该列表的长度相同,这样输出的每个组成部分就是定义的两行中两个条目都等于5的列数由相应的对。因此,对于问题中显示的df,下面显示的列表L对应于c(myFunc(1, 2), myFunc(2, 3)),其中myFunc如问题中的定义。

L <- list(1:2, 2:3)
myFunc2 <- function(x) myFunc(x[1], x[2])
sapply(L, myFunc2)
## [1] 2 2

请注意,*1中的myFunc是不必要的,因为sum会将逻辑参数强制转换为数字。

另一种选择是将第一行号指定为向量,第二行号指定为另一个向量。用L来说就是a <- sapply(L, "[", 1); b <- sapply(L, "[", 2)。然后使用mapply

a <- c(1, 2)  # L[[1]][1], L[[2]][1]
b <- c(2, 3)  # L[[1]][2], L[[2]][2]
mapply(myFunc, a, b)
## [1] 2 2