我有一个包含多行的数据框。我想调用一个函数使用任何两行。例如,假设我有此数据和接受两个参数的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个,有什么想法吗?
答案 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