【问题标题】:WEIRD: sapply not working on dplyr::tbl_df() local data.frame奇怪:sapply 不适用于 dplyr::tbl_df() 本地 data.frame
【发布时间】:2015-04-23 04:41:29
【问题描述】:

我之前没有看到有人发布过由于使用dplyrsapply 而导致的此错误,所以我想我想问问是否有人知道为什么会发生这种情况。这本身不是一个主要问题,因为解决方法非常简单,但它可能会让你们中的一些人免于想知道到底发生了什么的麻烦。样本数据取自here,我对同一篇文章中jbaums 给出的代码进行了修改。

样本数据

mydata <- data.frame(matrix(rlnorm(30*10,meanlog=0,sdlog=1), nrow=30))
colnames(mydata) <- c("categ", "var1","var2", "var3","var4", "var5", "var6", "var7", "var8", "var9")
mydata$var2 <- mydata$var2*5
mydata$categ <- sample(1:2)
mydata

用于制作多个箱线图的循环函数

sapply(seq_along(mydata)[-1], function(i) {
    y <- mydata[, i]
    names <- colnames(mydata)[i]
    plot(factor(mydata$categ), log(y + 1), main=names, ylab="foo",outpch=NA, las=1)
})

效果很好。

现在使用tbl_df()后出现此错误

require(dplyr)
mydata2 <- tbl_df(mydata)
sapply(seq_along(mydata2)[-1], function(i) {
    y <- mydata2[, i]
    names <- colnames(mydata2)[i]
    plot(factor(mydata2$categ), log(y + 1), main=names, ylab="foo",outpch=NA, las=1)
})
 Error in xy.coords(x, y, xlabel, ylabel, log) : 
  'x' and 'y' lengths differ 

解决方法非常简单,因为它只是:

mydata2 <- data.frame(mydata2)
## OR
lapply(...)

然后代码再次流畅运行。

知道为什么会发生这种情况吗?我认为这更像是sapplylapply 的问题,但我觉得这很有趣。

干杯,

哦。

【问题讨论】:

  • 这个问题已经得到解答还是还有更多需要解决的问题?如果您有其他解释,请随时发布您自己的答案(如果建议不充分)并接受,以便所有人都能受益。

标签: r apply dplyr lapply sapply


【解决方案1】:

[ 的不同之处:

> mydata[,2]
 [1] 5.0044042 0.8456266 1.6407979 0.3850787 6.0767393 1.8768533 1.0071454 0.3674155 0.6573932 0.3614813
[11] 1.8037157 1.1420720 0.5842170 0.4632418 1.1114478 1.1753951 0.1077499 0.9043782 3.0877567 0.9421167
[21] 1.2429474 1.8952458 0.4592660 0.3842183 1.1274421 2.2946488 2.0904511 0.4132986 0.3421766 0.7592236

> mydata2[,2]
Source: local data frame [30 x 1]

        var1
1  5.0044042
2  0.8456266
3  1.6407979
4  0.3850787
5  6.0767393
6  1.8768533
7  1.0071454
8  0.3674155
9  0.6573932
10 0.3614813
..       ...

因此您想要重现预期的行为简化而不是保留

mydata2[[2]]

注意类的变化:

> class(mydata)
[1] "data.frame"
> class(mydata2)
[1] "tbl_df"     "tbl"        "data.frame"
> class(mydata2[,2])
[1] "tbl_df"     "data.frame"

来自:?tbl_df

Methods

tbl_df implements two important base methods:

print
Only prints the first 10 rows, and the columns that fit on screen

[
Never simplifies (drops), so always returns data.frame

【讨论】:

  • 所以本质上是应用函数的“列格式”如何的问题?很有趣。
  • @OFish 不同之处在于[tbl_df 方法总是返回data.frame。我已经编辑了答案以使这一点更清楚。
猜你喜欢
  • 2016-04-01
  • 2012-04-17
  • 1970-01-01
  • 2015-12-31
  • 1970-01-01
  • 2015-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多