Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R ddply中的mapply_R_Dataframe_Plyr - Fatal编程技术网

R ddply中的mapply

R ddply中的mapply,r,dataframe,plyr,R,Dataframe,Plyr,注:这是对这一点的直接跟进 我有一个非常长的数据帧,由两列组成,我将它们用作函数的参数,该函数将使用mapply查找第三列的值,如下所示: df$3rd <- mapply(myfunction, A=df$1st, B=df$2nd) 这就是我得到的错误: Error in `$<-.data.frame`(`*tmp*`, "n", value = c(1L, 1L, 1L, 1L, 1L, : replacement has 112 rows, data has 1

注:这是对这一点的直接跟进


我有一个非常长的数据帧,由两列组成,我将它们用作函数的参数,该函数将使用mapply查找第三列的值,如下所示:

df$3rd <- mapply(myfunction, A=df$1st, B=df$2nd)
这就是我得到的错误:

Error in `$<-.data.frame`(`*tmp*`, "n", value = c(1L, 1L, 1L, 1L, 1L,  : 
  replacement has 112 rows, data has 16

“$
ddply
中的
错误不是您在这里想要的,
ddply(df,.(1st),FUNCTION)
更像是:

for each val in unique(df$1st)
    outdf[nrow(outdf)+1,] = FUNCTION( df[df$1st==val] )
也就是说,它使由
函数
组成的
outdf
应用于
df
列所确定的子集


在任何情况下,我认为您的错误可能是因为您在
函数(x)x$3中使用了
df
而不是
x
。一般来说,plyr函数是为了方便起见(语法方便),apply函数族通常在考虑时间的时候做得更好。想提供一个可复制的小例子吗?@zach。看看我对你先前问题的解答。它不再需要使用
mapply
expand.grid
谢谢@mathematic.coffee。我认为你是对的——ddply不会带来性能提升,而且将我的函数矢量化是个好主意。然而,我的函数用于查找另外两个数据帧中的值——见上文和前面的问题——所以矢量化不可能实现。我想我会回到我的pre-R策略,它是用python处理我的数据,并使用R分析生成的表。@Zach。在的评论中,您找到了。“它对这个也有用吗?”马修道尔说。它可能适用于这种情况,但data.table不需要它。本问题旨在澄清前一个问题的解决方案之一遇到的问题。Ramnath的data.table解决方案速度足够快,内存占用更少,所以我可以直接使用他的解决方案,而不用担心这个问题。如果您想知道是否可以将多个参数传递给data.table,我不确定,但您肯定可以将其连续传递给函数。此外,-data.table的行为与data.frame不同,因此请仔细检查结果,直到确定正确为止。
library(reshape2)
foo <- data.frame(x = c('a', 'a', 'a', 'b', 'b', 'b'), 
                  y = c('ab', 'ac', 'ad', 'ae', 'fx', 'fy'))
bar <- data.frame(x = c('c', 'c', 'c', 'd', 'd', 'd'), 
                  y = c('ab', 'xy', 'xz', 'xy', 'fx', 'xz'))

nShared <- function(A, B) {
    length(intersect(with(foo, y[x==A]), with(bar, y[x==B])))
}

# Enumerate all combinations of groups in foo and bar
(combos <- expand.grid(foo.x=unique(foo$x), bar.x=unique(bar$x)))

# Find number of elements in common among all pairs of groups
combos$n <- mapply(nShared, A=combos$foo.x, B=combos$bar.x)

# Reshape results into matrix form
dcast(combos, foo.x ~ bar.x)
#   foo.x c d
# 1     a 1 0
# 2     b 0 1
for each val in unique(df$1st)
    outdf[nrow(outdf)+1,] = FUNCTION( df[df$1st==val] )