Вызовите функцию, похожую на применение, для сопоставления двух строк - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть датафрейм с несколькими строками.Я хочу, чтобы вызвать функцию, используя любые две строки.Например, допустим, у меня есть эти данные и 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)

Я хочу применить myFunc для строк 1 и 2, myFunc(1,2), и я ожидаю, что 2, myFunc вычислит, сколько "5 "имеют общее в одном столбце, между строками 1 и 2.

Поскольку у меня есть тысячи строк, и я хочу сопоставить все пары, я хочу сделать это без написания цикла for, может быть ссемейство функций вызова или применения.

Я пробовал это:

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 голосов
/ 20 сентября 2018

Вопрос недавно изменился.Насколько я понимаю, что входные данные должны быть списком пар номеров строк, а выходные данные должны иметь ту же длину, что и этот список, так что каждый компонент выходных данных представляет собой число столбцов, в которых обе записи равны 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 in 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
0 голосов
/ 20 сентября 2018

Попробуйте передать строки вместо индекса строки

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)

...