将一个数字添加到数组的每个元素上。

huangapple go评论113阅读模式
英文:

Sum a number to each element of an array

问题

我想对数组的每个元素加5(不涉及所有维度),而不使用循环。结果,我希望得到一个具有完全相同维度的数组,但每个元素都应加5。我尝试使用sum和apply函数,但要么得到每个元素的总和(一个数字),要么出现以下错误消息:

  1. Error in apply(b[, , , 2], 5, FUN = sum, na.rm = T) :
  2. 'MARGIN' does not match dim(X)

因为我的数据集中有很多NA,所以我需要na.rm = T,所以我希望得到NA + 5 = 5。

这里有一个示例,我试图对所有维度加5,但不包括[,,,1]

  1. b <- array(seq(1,48,1), dim = c(4,2,3,2))
  2. b[4,2,3,2] <- NA

我尝试过:

  1. apply(b[,,,2], 5, FUN = sum, na.rm = T)
  2. sum(b[,,,2], 5, na.rm = T)

我期望的答案是:

  1. (a <- array(c(seq(1,24,1),seq(25,47,1)+5, 5), dim = c(4,2,3,2)))
英文:

I would like to sum 5 to each element of an array (not through all dimensions) without using a loop for. As the result, I want to get an array with the exact same dimensions, but each element should have 5 added to it. I tried using the sum and the apply functions, but I either get the sum of each of the elements (one number), or this error message:

  1. Error in apply(b[, , , 2], 5, FUN = sum, na.rm = T) :
  2. &#39;MARGIN&#39; does not match dim(X)

I need to have na.rm = T, because there are a lot of NA in my dataset, so I want to get NA + 5 = 5

Here is an example where I'm trying to sum 5 to all dimensions but to [,,,1] :

  1. b &lt;- array(seq(1,48,1), dim = c(4,2,3,2))
  2. b[4,2,3,2] &lt;- NA

I tried:

  1. sum(b[,,,2], 5, na.rm = T)

I was expecting to get as an answer:

  1. (a &lt;- array(c(seq(1,24,1),seq(25,47,1)+5, 5), dim = c(4,2,3,2)))

答案1

得分: 3

R默认支持将值添加到矩阵和数组中。您可以使用 + 运算符将值添加到向量/

英文:

R by default supports adding to matricies and arrays. You can just use the + operator to add a value to each element of a vector/matrix/array. Since you only want to affect parts of that array, just use square brackets to subset the parts you want to affect:

  1. b[,,,2] &lt;- b[,,,2] + 5
  2. table(b==a, useNA=&#39;always&#39;)
  3. TRUE &lt;NA&gt;
  4. 47 1

You have NA values in your array. In R, by default, operations involving an NA return NA. So in this case, the NA values in b will remain NA after the addition.

If you want different behavior, for example if you want NA + 5 = 5, then you need to convert the NA values to 0 in the parts of the array you care about before doing the addition

To replace all NAs with 0:

  1. b[is.na(b)] &lt;- 0

To only do that in b[,,,2]:

  1. b[,,,2][is.na(b[,,,2])] &lt;- 0

答案2

得分: 1

We can do

  1. replace(b, is.na(b), 0) + 5

, , 1, 1

[,1] [,2]

[1,] 6 10

[2,] 7 11

[3,] 8 12

[4,] 9 13

, , 2, 1

[,1] [,2]

[1,] 14 18

[2,] 15 19

[3,] 16 20

[4,] 17 21

, , 3, 1

[,1] [,2]

[1,] 22 26

[2,] 23 27

[3,] 24 28

[4,] 25 29

, , 1, 2

[,1] [,2]

[1,] 30 34

[2,] 31 35

[3,] 32 36

[4,] 33 37

, , 2, 2

[,1] [,2]

[1,] 38 42

[2,] 39 43

[3,] 40 44

[4,] 41 45

, , 3, 2

[,1] [,2]

[1,] 46 50

[2,] 47 51

[3,] 48 52

[4,] 49 5

Disclaimer: 此答案涉及“我想将数组的每个元素加5”,其中NA应被视为0

英文:

We can do

  1. replace(b, is.na(b), 0) + 5
  2. # , , 1, 1
  3. #
  4. # [,1] [,2]
  5. # [1,] 6 10
  6. # [2,] 7 11
  7. # [3,] 8 12
  8. # [4,] 9 13
  9. #
  10. # , , 2, 1
  11. #
  12. # [,1] [,2]
  13. # [1,] 14 18
  14. # [2,] 15 19
  15. # [3,] 16 20
  16. # [4,] 17 21
  17. #
  18. # , , 3, 1
  19. #
  20. # [,1] [,2]
  21. # [1,] 22 26
  22. # [2,] 23 27
  23. # [3,] 24 28
  24. # [4,] 25 29
  25. #
  26. # , , 1, 2
  27. #
  28. # [,1] [,2]
  29. # [1,] 30 34
  30. # [2,] 31 35
  31. # [3,] 32 36
  32. # [4,] 33 37
  33. #
  34. # , , 2, 2
  35. #
  36. # [,1] [,2]
  37. # [1,] 38 42
  38. # [2,] 39 43
  39. # [3,] 40 44
  40. # [4,] 41 45
  41. #
  42. # , , 3, 2
  43. #
  44. # [,1] [,2]
  45. # [1,] 46 50
  46. # [2,] 47 51
  47. # [3,] 48 52
  48. # [4,] 49 5

Disclaimer: This answer refers to "I would like to sum 5 to each element of an array" where NA should be considered a 0.

huangapple
  • 本文由 发表于 2023年3月4日 04:41:45
  • 转载请务必保留本文链接:https://go.coder-hub.com/75631697.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定