【问题标题】:Split R vector into even size chunks [duplicate]将R向量拆分成大小均匀的块[重复]
【发布时间】:2017-01-22 17:25:19
【问题描述】:

这看起来应该是微不足道的,但结果却出乎意料

# create empty list
list=c()
# create vector of one hundred 4s
fours=rep(4,100)
# for loop. Try to split into 10
for(i in seq(10)){
  # split into chunks: i=1, take fours[1:10]; i=2, fours[11:20]...
  # when i=10, should return fours[91:100]
  chunks=fours[1+10*(i-1):10*i]
  # add smaller lists of four back into bigger list
  list=c(list,chunks)
}
list
# returns  [1]  4  4  4  4  4  4  4  4  4  4 NA  4  4  4  4 NA NA NA NA NA NA  4  4 NA NA
[26] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA

我希望只取回一百个4 值。

【问题讨论】:

  • 从我的第一眼看,我们都犯的一个严重错误是在子集化时在 : 周围使用算术运算符时会忽略那些 ()

标签: r list for-loop vector


【解决方案1】:

以下行需要更正(为正确的算术运算添加括号):

chunks=fours[1+10*(i-1):10*i]

更正的代码:

fours=rep(4,100)
chunks = list()
for(i in 1:10){
    chunks[[i]] = fours[(1+((i-1)*10)) : (10+((i-1)*10))]
}
chunks

或者:

fours=rep(4,100)
chunks = list()
for(i in 1:10){
    start = 1+((i-1)*10)
    chunks[[i]] = fours[ start : (9+start)]
}
chunks

输出:

[[1]]
 [1] 4 4 4 4 4 4 4 4 4 4

[[2]]
 [1] 4 4 4 4 4 4 4 4 4 4

[[3]]
 [1] 4 4 4 4 4 4 4 4 4 4

[[4]]
 [1] 4 4 4 4 4 4 4 4 4 4

[[5]]
 [1] 4 4 4 4 4 4 4 4 4 4

[[6]]
 [1] 4 4 4 4 4 4 4 4 4 4

[[7]]
 [1] 4 4 4 4 4 4 4 4 4 4

[[8]]
 [1] 4 4 4 4 4 4 4 4 4 4

[[9]]
 [1] 4 4 4 4 4 4 4 4 4 4

[[10]]
 [1] 4 4 4 4 4 4 4 4 4 4

【讨论】:

  • 谢谢...但还有两个问题:1)长度(列表)=110。我们想要 100。为什么会有差异? 2) 为什么最后一个 NA 值?
  • 检查您的输出,它没有给出预期的输出:list 的长度为 110 个值,并以 NA 结尾
  • 添加括号是这里的基本问题。可以考虑括号来更正这些值。
  • 我在上面添加了更正的代码。
猜你喜欢
  • 2021-06-24
  • 2014-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-14
相关资源
最近更新 更多