【问题标题】:Substring each element of the data frame in R在R中对数据框的每个元素进行子串化
【发布时间】:2020-03-27 22:54:15
【问题描述】:

我想使用我在此处找到的代码:Generate N random integers that sum to M in R。我有一个示例数据框,我想为数据框中的每个值使用此函数。

rand_vect <- function(N, M, sd = 1, pos.only = TRUE) {
  vec <- rnorm(N, M/N, sd)
  if (abs(sum(vec)) < 0.01) vec <- vec + 1
  vec <- round(vec / sum(vec) * M)
  deviation <- M - sum(vec)
  for (. in seq_len(abs(deviation))) {
    vec[i] <- vec[i <- sample(N, 1)] + sign(deviation)
  }
  if (pos.only) while (any(vec < 0)) {
    negs <- vec < 0
    pos  <- vec > 0
    vec[negs][i] <- vec[negs][i <- sample(sum(negs), 1)] + 1
    vec[pos][i]  <- vec[pos ][i <- sample(sum(pos ), 1)] - 1
  }
  vec
}


abc <- data.frame(Product = c("A", "B", "C"), 
                  Value =c(33, 23, 12))

【问题讨论】:

  • 这里的NM 是什么。我猜MValue 列。 N 是什么?
  • 例如M = 7

标签: r dataframe


【解决方案1】:

您可以矢量化您的函数rand_vect 以接收值数组

vrand_vect <- Vectorize(rand_vect,"M",SIMPLIFY = F)

给了

res <- vrand_vect(N= 7, M = abc$Value)
> res
[[1]]
[1] 3 5 6 6 4 3 6

[[2]]
[1] 1 3 4 5 3 4 3

[[3]]
[1] 1 2 3 3 1 2 0

【讨论】:

    【解决方案2】:

    您可以使用sapply 运行rand_vectN = 7

    sapply(abc$Value, rand_vect, N = 7)
    
    #     [,1] [,2] [,3]
    #[1,]    4    4    0
    #[2,]    5    2    2
    #[3,]    5    4    2
    #[4,]    4    3    3
    #[5,]    5    5    3
    #[6,]    6    2    1
    #[7,]    4    3    1
    

    这将给出 7 个随机数,总和为 Value

    我们可以通过验证

    colSums(sapply(abc$Value, rand_vect, N = 7))
    #[1] 33 23 12
    

    【讨论】:

    • 如果我想重复 sapply 例如两次,但结果不同怎么办? rep(sapply(abc$Value, rand_vect, N = 7), 2)?
    • 使用replicate, replicate(2, sapply(abc$Value, rand_vect, N = 7), simplify = FALSE)
    • 如果我有更多的列值怎么办?因为现在它适用于一列?
    • rand_vect 一次取 1 个值。如果您有更多值,请根据您想要的输出使用unlist (如sapply(unlist(abc[1:2]), rand_vect, N = 7)lapply(abc[1:2], function(x) sapply(x, rand_vect, N = 7)))将它们组合在一起。
    猜你喜欢
    • 2021-10-13
    • 2015-03-06
    • 2021-10-13
    • 2021-12-04
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    相关资源
    最近更新 更多