【问题标题】:Trying to generate a data frame in a for loop尝试在 for 循环中生成数据框
【发布时间】:2016-02-18 01:51:11
【问题描述】:

目前我正在编写以下代码:

data <- rep(1:3, times = c(10,4,6))
for(i in 1:5) {
  samp <- sample(data, 4)
  data <- exclude(data, samp)
  print(samp)

  for(i in 1:3) {
        prsamp <- sum(samp == i)/4
        print(prsamp)
  }

  if (length(data) == 0) {
        break
  }
}

这当前打印出五个长度为 4 的向量,每个数字出现在每个向量中的相应概率。

> source("buffoon.R")
> buffoon(20, 4, 3, c(10,4,6))
[1] 1 1 2 3
[1] 0.5
[1] 0.25
[1] 0.25
[1] 1 3 3 2
[1] 0.25
[1] 0.25
[1] 0.5
[1] 2 1 1 1
[1] 0.75
[1] 0.25
[1] 0
[1] 3 1 2 3
[1] 0.25
[1] 0.25
[1] 0.5
[1] 1 3 1 1
[1] 0.75
[1] 0
[1] 0.25

因此,例如,第一个向量 1123 为我们提供了 1 的 0.5 个概率、2 的 0.25 和 3 的 0.25。我想将输出转换为一个不错的数据框,在第 1 列中列出每个行向量,在第 2 列中,另一个行向量对应于相应的元素概率出现,但我遇到了很多错误。我已经研究这个问题几个小时了,但没有成功。任何帮助表示赞赏。

我理想的数据框应该是这样的:

     Sample        Probability Dist
1    1123          0.5 0.25 0.25
2    1332          0.25 0.25 0.5

以此类推,一直到第 5 行。

【问题讨论】:

  • exclude 函数来自哪个包?
  • exclude &lt;- function(from, where) { for (i in where) if (i %in% from) { from = from[-match(i, from)] }; from }
  • 这是一个基本上从多重集中删除子多重集的功能
  • 向我们展示最终向量的样子,以及输出的样子。编辑您的问题。

标签: r


【解决方案1】:

您要做的第一件事是创建一个空数据框。其次,您将希望您的 for 循环写入此数据帧,而不是简单地直接打印出结果。此外,您不想在已经使用 i 的 for 循环中使用包含 i 作为变量的 for 循环。我建议您尝试以下方法:

data <- rep(1:3, times = c(10,4,6))
datafr <- data.frame(Sample=rep(NA,5),Probability.Dist=rep(NA,5))
for(i in 1:5) {
  samp <- sample(data, 4)
  data <- exclude(data, samp)
  datafr$Sample[i] <- samp[1]*1000+samp[2]*100+samp[3]*10+samp[4] #easy way of getting your wanted sample layout

  prsamp <- rep(0,3)
  for(j in 1:3) {
        prsamp[j] <- sum(samp == j)/4
  }
  datafr$Probability.Dist[i] <- toString(prsamp)

  if (length(data) == 0) {
        break
  }
}
datafr
#  Sample Probability.Dist
#1   1231  0.5, 0.25, 0.25
#2   2132  0.25, 0.5, 0.25
#3   1313      0.5, 0, 0.5
#4   2111    0.75, 0.25, 0
#5   3131      0.5, 0, 0.5

我还必须建议您不要在数据框的单列中使用 3 个值。为了进一步分析甚至可读性,最好为每个值提供它自己的列。

【讨论】:

  • 非常感谢。我会听听你的建议。顺便说一句,假设我想将samp[1]*1000+samp[2]*100+samp[3]*10+samp[4] 推广到(1,10,100, ... , 10^(n-1))(samp[1], ... , samp[n]) 的点积?怎么写?
  • 应该是10^(n-i:0) %*% (samp[1] , ... , samp[n]),但我无法紧凑地表达第二行向量。
  • 我试过10^(n-j:0) %*% samp[1:n],但我收到了一个参数不一致的错误。
  • 没关系!我太愚蠢。我现在看到它是10^(n-1:0) %*% samp[1:n]。 =]
  • 哎呀,不同的时区,很高兴你自己搞定了:)
猜你喜欢
  • 1970-01-01
  • 2018-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-29
  • 2022-01-04
相关资源
最近更新 更多