【问题标题】:For loop R create and populate new column with output对于循环 R 创建并使用输出填充新列
【发布时间】:2014-08-28 11:28:21
【问题描述】:

我有一个带有一些结果的 csv。我想遍历结果,运行 power.prop.test 并在新列中输出每一行的结果。到目前为止,我得到了这个:

data <- read.csv("Downloads/data.csv", sep = ",", header = TRUE)

for (i in 1:nrow(data)) {
  n <- power.prop.test( p1 = data[i,5], p2 = data[i,6], sig.level=.1, power = .8, alternative = "one.sided")
  data <- cbind(data, n[1])
}
head(data)

我不是用输出填充一列,而是循环并为我正在运行的 power.prop.test 创建一个新列。我为每个输出绑定一个新列,而不是用每个输出填充一个列。问题是我不确定如何实现后者。

如果有人对如何将这些输出合并到一列有任何建议,那就太好了。

谢谢!

【问题讨论】:

  • 在需要的数据类型之前创建一个新列(例如data$output = 0),然后在循环中写入data[i,'output'] = (relevant value)
  • 请注意,read.csv("Downloads/data.csv") 就可以了。您包含了 sepheader 的默认值
  • 此处描述了电源道具测试:stat.ethz.ch/R-manual/R-patched/library/stats/html/…
  • @user2471446:您正在为每个循环寻找一个新列,对吧?我承认,我不确定dplyr 是否能够做到这一点,抱歉。不过,我很想看到使用这个包的解决方案。
  • @user1362215:我非常接近您的建议,但我在第 8 条记录中收到以下错误“提供 8 个变量来替换 1 个变量”。所以它只填充前 8 行的列。再次感谢您的帮助。

标签: r for-loop populate


【解决方案1】:

试试这个:

data <- read.csv("Downloads/data.csv", sep = ",", header = TRUE)

data$newcolumn <- 0

for (i in 1:nrow(data)) {
  n <- power.prop.test( p1 = data[i,5], p2 = data[i,6], sig.level=.1, power = .8, alternative = "one.sided")
  data$newcolumn[i] <- n
}
head(data)

我刚刚添加了一个新列,用零填充它,然后在计算时一次添加一个 power.prop.test 值。

【讨论】:

  • 就像一个魅力,谢谢。我最终的做法略有不同(见下文),但这完全有效。
  • 小改变,你需要这个:data$newcolumn[i]
【解决方案2】:

感谢大家的帮助!这是我现在使用的解决方案:

# Read in csv of results
data <- read.csv("Downloads/data.csv")
data$obs=0
data$obs2=0
data$sig=0

# Create a loop to calculate required observations for each test based on CR,     Significance and Statistical Power
for (i in 1:nrow(data)) {
# Error handling: where CR are the same, cannot calculate n and fails, we skip these tests
  possibleError <- tryCatch(
      n <- power.prop.test( p1 = data[i,5], p2 = data[i,6], sig.level=.2, power = .8, alternative = "one.sided")
  ,error=function(e)e
  )
  if(!inherits(possibleError, "error")){
# Real work: calculate n, determine if bigger than actual observations, if not assign   sig = 0, otherwise =1
   n <- power.prop.test( p1 = data[i,5], p2 = data[i,6], sig.level=.2, power = .8,  alternative = "one.sided")
    data[i,'obs'] = n[[1]]
    data$obs2[i] = data$obs[i] * 2
    if(data$obs[i]*2 < data$Traffic[i]) {
      data$sig[i] <- 1
    } else {
      data$sig[i] <-0
    }
    }
    }    
# End for loop

write.csv(data,file = "dataClean.csv")

这会在每一行上运行 power.prop.test,包括错误处理和一个条件来告诉您是否有足够的观察结果。我确信有更有效的方法来编写这个,所以我会检查你的 cmets 看看我是否可以合并它们。

【讨论】:

    【解决方案3】:

    看起来像是apply 的工作。为了避免对因子或字符变量的任何可能干扰,我只是将两列作为参数提交。

    data$power.col <- apply(data[5:6], 1,  
                          function(x) power.prop.test, p1 = x[1], p2 = x[2], 
                             sig.level=.1, power = .8, alternative = "one.sided")
          }
    

    【讨论】:

      【解决方案4】:

      首先,我应该说我从未听说过 power-prop 测试。不过话说回来,你的问题真的不是关于统计数据的问题,对吧?

      其次,有一个包可以将列添加到data.frame,即dplyr

      引用文档: mutate(mtcars, displ_l = disp / 61.0237) - “添加一列 displ_l(到 mtcars),其中包含 disp 列除以 61.0237 的值。”

      【讨论】:

      • 那和$&lt;-有什么不同?
      猜你喜欢
      • 2021-05-20
      • 1970-01-01
      • 1970-01-01
      • 2017-02-26
      • 1970-01-01
      • 2023-01-12
      • 1970-01-01
      • 2019-03-27
      • 1970-01-01
      相关资源
      最近更新 更多