【问题标题】:counting the characters of each cell in data.table计算 data.table 中每个单元格的字符
【发布时间】: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 Aa 列中的 2 是错误的?

【问题讨论】:

  • as.matrix(res)
  • @Frank 当然!但仍然是个谜,对吧?
  • 在这个问题中,您在 R 中有很多不良做法 101,我真的希望您制作这个 MRE 仅用于演示目的。
  • @DavidArenburg 请启发我们,...先生!
  • 在循环中增长对象,将apply与data.table一起使用,在循环中使用samplepaste0等矢量化函数,每行运行data.table(!),等等。每次我看它时,我都会看到一些新的东西。如果你在你的真实代码中使用这种做法,我敢打赌,如果它运行了好几天,我不会感到惊讶。

标签: r data.table apply lapply nchar


【解决方案1】:

当您将 res 强制转换为矩阵(使用 apply 时的第一个操作)时,您会得到:

as.matrix(res)
#-------------------
      a    b           
 [1,] " 7" "eafdgcb"   
 [2,] " 2" "ab"        
 [3,] " 8" "efcbdhga"  
 [4,] " 1" "a"         
 [5,] "10" "hdeifajgbc"
 [6,] " 4" "dbac"      
 [7,] " 5" "daecb"     
 [8,] " 6" "eadbfc"    
 [9,] " 9" "chfdbiaeg" 
[10,] " 3" "acb" 

【讨论】:

  • 太棒了!所以下一个问题必须要问...为什么两列都解析as.character 而不是as.some.numerical (int/num)?
  • R 中的矩阵只能是一种类型并且存在类型层次结构,因此character 是“在层次结构上低于numeric 并且在以下情况下被选为“最小公分母”这两种类型都存在于数据框或其他数据源中。在?as.matrix 的详细信息部分中有所解释。
【解决方案2】:

这是从 res$a 到 as.matrix 的转换问题。字符串用空格填充到最宽的显示宽度。

你可以在here找到这个行为的详细解释。

【讨论】:

  • 很好的发现。许多 R 用户不知道 apply() 意味着对 matrix 的强制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-09
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多