【问题标题】:dataframe is collapsed to a vector when given to function当给函数时,数据框被折叠成一个向量
【发布时间】:2017-06-14 17:16:26
【问题描述】:

我正在尝试在函数中使用数据框的内容,这是我的问题的简化示例。

df <- data.frame(v1=1:10,v2=23:32)
df2 <- data.frame(v1=1:3,v2=3:5)

fxm <- function(x,y,q)
{
    return(cbind(q[q[,2]==x,],y))
}

mapply(fxm,df[,1],df[,2],q=df2)

q[, 2] 中的错误:维数不正确

如果我添加一个打印语句: df

fxm <- function(x,y,q)
{
    print(q)
    return(cbind(q[q[,2]==x,],y))
}

mapply(fxm,df[,1],df[,2],q=df2)

我明白了:

[1] 1 2 3

q[, 2] 中的错误:维数不正确

由于某种原因,数据框被转换为其第一列的向量。如何阻止这种情况发生,并使我的函数可以访问整个数据框?

我正在尝试选择数据帧的一个子集并根据函数的其他两个参数返回它,这就是为什么我需要将整个数据帧传递给函数。

【问题讨论】:

  • 您希望得到什么结果? - 作为第一次尝试,尝试从函数中的q 索引中删除逗号(即return(x+y+q[2])
  • 我认为我的问题过于简单化了,我已经对其进行了编辑,希望能将其弄清楚一点。由于某些我不理解的默认行为,从 q 索引中删除逗号只会从来自我的数据框第一列的向量中选择第二个元素,这对我没有帮助,因为我需要访问第 n 个数据帧的列进行比较操作,数据帧的其余部分返回它。
  • 这个函数的预期输出是什么?
  • data[, singe_column] 将返回一个向量。您可以使用data[single_column]data[, single_column, drop = FALSE] 返回一个数据框。这本质上是R-FAQ 7.5
  • 也就是说,您似乎也没有做任何事情来确保您绑定在一起的向量具有相同的长度,因此也可能导致问题。

标签: r dataframe mapply custom-function


【解决方案1】:

如果我理解正确,您希望将整个 q = df2 传递给您定义的 fxm 函数,对吗?

问题是在您的代码中mapply 将从q = df2 中提取元素作为一些附加参数,就像从df[,1]df[,2] 中提取元素一样。您需要为mapply 设置MoreArgs 参数以将整个内容传递给函数,如下所示:

df <- data.frame(v1=1:10,v2=23:32)
df2 <- data.frame(v1=1:3,v2=3:5)

fxm <- function(x,y,q)
{
    print(q)
    return(cbind(q[q[,2]==x,],y))
}

mapply(fxm,df[,1],df[,2], MoreArgs = list(q=df2))

这对我仍然不起作用,并且其他地方有一些错误。从打印结果可以看到整个data.frame打印出来了,解决了你原来的问题。

【讨论】:

    猜你喜欢
    • 2021-07-12
    • 2014-10-22
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多