【发布时间】:2018-07-22 21:30:08
【问题描述】:
所以我为所有 R 爱好者提供了这个谜语:
library(data.table)
set.seed(666)
res<-data.table(NULL)
for(i in 1:10){
res<-rbind(res,data.table(a=i,b=paste0(letters[sample(1:i)],collapse = "")))
}
res<-res[sample(10)]
导致:
>res
a b
1: 1 a
2: 9 dhgcbeifa
3: 3 cba
4: 7 gcafdeb
5: 6 eacdfb
6: 8 dacbfehg
7: 10 fehjaigcbd
8: 4 dacb
9: 5 daecb
10: 2 ba
但是 案例A
>t(apply(res,1,nchar))
a b
[1,] 2 1
[2,] 2 9
[3,] 2 3
[4,] 2 7
[5,] 2 6
[6,] 2 8
[7,] 2 10
[8,] 2 4
[9,] 2 5
[10,] 2 2
然而案例B
>res[,lapply(.SD, nchar)]
a b
1: 1 1
2: 1 9
3: 1 3
4: 1 7
5: 1 6
6: 1 8
7: 2 10
8: 1 4
9: 1 5
10: 1 2
我的问题是为什么 case A 中 a 列中的 2 是错误的?
【问题讨论】:
-
as.matrix(res) -
@Frank 当然!但仍然是个谜,对吧?
-
在这个问题中,您在 R 中有很多不良做法 101,我真的希望您制作这个 MRE 仅用于演示目的。
-
@DavidArenburg 请启发我们,...先生!
-
在循环中增长对象,将
apply与data.table一起使用,在循环中使用sample、paste0等矢量化函数,每行运行data.table(!),等等。每次我看它时,我都会看到一些新的东西。如果你在你的真实代码中使用这种做法,我敢打赌,如果它运行了好几天,我不会感到惊讶。
标签: r data.table apply lapply nchar