我之前没有看到有人因为dplyr
与sapply
一起使用而发布此错误,所以我想我会问是否有人知道为什么会这样。这本身并不是一个重大问题,因为解决方法非常简单,但它可能会让你们中的一些人不知道究竟是在发生什么。样本数据取自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(...)
然后代码再次顺利运行。
知道为什么会这样吗?我收集的更多是sapply
与lapply
的问题,但我发现它非常有趣。
干杯,
0。
答案 0 :(得分: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