【问题标题】:R modifying a data.frame in a for loopR在for循环中修改data.frame
【发布时间】:2021-08-11 13:12:38
【问题描述】:

来自 Java 我正在尝试学习 R(和一些统计数据) 我正在尝试重现下表

来自 Jonathan Gillard:统计推断的第一门课程 此表显示了从存钱罐替换的两次平局的可能结果 存钱罐

使用以下代码,我遇到了一些意想不到的(至少对于 Java 程序员而言)行为。

前七行基本上给了我我想要的,除了 (5, 10) 和 (10, 5) 应该聚合在一个类别中。我曾想过为此使用一个集合,但集合库似乎把前 7 行弄乱了。

    library(dplyr)
rm(list=ls())
piggybank <- c(5, 10, 10, 20, 50, 50)
draws <- expand.grid(d1=piggybank, d2=piggybank)
draws <- draws %>% rowwise() %>% mutate(sum=sum(c(d1,d2)), var=var(c(d1,d2)), mean=mean(c(d1,d2)))
draws <- draws %>% group_by(d1, d2, var, mean, sum) %>% summarise(n=n())
draws <- draws %>% ungroup() %>% mutate(P=n/sum(n))
nr <- nrow(draws)
aggdraws <- data.frame(x1x2=character(0), var=numeric(0), mean=numeric(0), sum=numeric(0), n=numeric(0))
str(aggdraws)
local(
  for (i in 1:nr) {
    newrow <<- data.frame(x1x2=character(1), var=numeric(1), mean=numeric(1), sum=numeric(1), n=numeric(10))
    newrow$n <- draws[i, ]$n
    newrow$var <- draws[i, ]$var
    newrow$mean <- draws[i, ]$mean
    newrow$sum <- draws[i, ]$mean
    
    newrow$x1x2 <- paste(min(draws[i, ]$d1, draws[i, ]$d2), max(draws[i, ]$d1, draws[i, ]$d2))
    
    #print(aggdraws)
    if (nrow(aggdraws) > 0) {
      for(j in 1:nrow(aggdraws)) {
        print(paste(aggdraws[j,]$x1x2, newrow$x1x2))
        if(aggdraws[j,]$x1x2 == newrow$x1x2) {
          aggdraws[j,]$n <- aggdraws[j,]$n +newrow$n
        } else {
          aggdraws[nrow(aggdraws)+1, ] <- newrow
        }
      }
    } else {
      aggdraws[nrow(aggdraws)+1, ] <- newrow
    }
  }
)

newrow

newrow 似乎不是 for 循环的本地,它在每次迭代中都填充了一行。每次迭代都需要一个新实例

可能是因为这种行为 if(aggdraws[j,]$x1x2 == newrow$x1x2) 永远不会评估为 TRUE

任何帮助将不胜感激。对于来自 Java 或其他面向对象语言的程序员来说,是否有一本好书或其他资源指出了 R 的缺陷?

谢谢,

汉斯

【问题讨论】:

  • 您好。我不太确定确切的问题。 R 的一个好的开始是本书R for Data Science,更高级的阅读n Advanced R
  • newrow &lt;&lt;- data.frame(x1x2=character(1), var=numeric(1), mean=numeric(1), sum=numeric(1), n=numeric(10)) --> n = numeric(10) 创建一个长度为 10 的向量。将其替换为 numeric(1) 以获得长度为 1 的向量。可能这就是你奇怪行为的根源。

标签: r dataframe loops for-loop


【解决方案1】:

这不是您问题的直接答案。我查看了您的代码并针对dplyr 优化了第一部分:

draws <- expand.grid(d1=piggybank, d2=piggybank) %>% 
  rowwise() %>%
  mutate(d1_new = min(d1, d2),
         d2_new = max(d1, d2)) %>%
  select(d1 = d1_new, d2 = d2_new) %>%
  mutate(sum = sum(d1, d2), 
         var = var(c(d1, d2)), 
         mean = mean(d1, d2))%>% 
  group_by(d1, d2, var, mean, sum) %>% 
  summarise(n = n(), .groups="drop") %>%
  mutate(P = n/sum(n))

返回

# A tibble: 10 x 7
      d1    d2    var  mean   sum     n      P
   <dbl> <dbl>  <dbl> <dbl> <dbl> <int>  <dbl>
 1     5     5    0       5    10     1 0.0278
 2     5    10   12.5     5    15     4 0.111 
 3     5    20  112.      5    25     2 0.0556
 4     5    50 1012.      5    55     4 0.111 
 5    10    10    0      10    20     4 0.111 
 6    10    20   50      10    30     4 0.111 
 7    10    50  800      10    60     8 0.222 
 8    20    20    0      20    40     1 0.0278
 9    20    50  450      20    70     4 0.111 
10    50    50    0      50   100     4 0.111 

这几乎是 Jonathan Gillard 中的表格:统计推断的第一门课程。

【讨论】:

    猜你喜欢
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多