对于循环R,使用输出创建并填充新列

时间:2014-07-07 20:58:45

标签: r for-loop populate

我有一些带有一些结果的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创建一个新列。我正在运行。我为每个输出绑定一个新列,而不是为每个输出填充一列。问题是我不确定如何实现后者。

如果有人对如何将这些输出合并到一个非常棒的列中有任何建议。

谢谢!

4 个答案:

答案 0 :(得分:5)

试试这个:

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值。

答案 1 :(得分:1)

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

# 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,包括错误处理和告诉您是否有足够观察的条件。我确定有更有效的方式来撰写此文章,因此我会审核您的评论,看看我是否可以合并它们。

答案 2 :(得分:0)

首先,我应该说我从未听说过动力支柱测试。但话说回来,你的问题真的不是统计数据,对吗?

其次,有一个软件包可以向data.frame添加列,即dplyr

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

答案 3 :(得分:0)

看起来像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")
      }