逐行追加到数据框的字符格式问题

时间:2014-05-30 15:18:08

标签: r append dataframe rows

我正在尝试从mapply的输出构建数据帧。

这是我输出的一个例子。

> out[1:9,1]
$statistic
X-squared 
 1311.404 

$parameter
df 
 1 

$p.value
[1] 1.879366e-287

$estimate
     prop 1      prop 2 
0.001680737 0.009517644 

$null.value
NULL

$conf.int
[1] -1.000000000 -0.007153045
attr(,"conf.level")
[1] 0.95

$alternative
[1] "less"

$method
[1] "2-sample test for equality of proportions with continuity correction"

$data.name
[1] "members out of enrolled"

我想将这些值放入数据框中。我在这个矩阵中有1684行。我想要一个1684行的数据帧。

我还有来自此数据之外的代码,我想将其合并到数据框中。这些是来自fwa $ proc的字符串。

> out[,1]$p.value
[1] 1.879366e-287
> out[,1]$estimate[[1]]
[1] 0.001680737
> out[,1]$estimate[[2]]
[1] 0.009517644
> as.character(fwa$proc[1])
[1] "10022"

我在这里寻求支持这样做。我首先创建一个数据帧,然后尝试逐行从另一个数据帧填充我的数据帧......

n<-1684

  new.df <- data.frame(cpt=character(n), FFS_prop=numeric(n), PHN_prop=numeric(n)
                 , differnce=numeric(n), results=character(n), Null_HO = character(n), Alt_HA=character(n), stringsAsFactors=FALSE)

这是头部。

> head(new.df)
  cpt FFS_prop PHN_prop differnce results Null_HO Alt_HA
1            0        0         0                       
2            0        0         0                       
3            0        0         0                       
4            0        0         0                       
5            0        0         0                       
6            0        0         0 

现在逐行填充数据......

for (i in 1:n) new.df[i, ] <- data.frame(cpt = toString(fwa$proc[i])
       ,FFS_prop=round(out[,i]$estimate[[1]],5)
       ,PHN_prop=round(out[,i]$estimate[[2]],5)
       ,differnce=round(out[,i]$estimate[[1]]-out[,i]$estimate[[2]],5)
       ,results=if(out[,i]$p.value <.05) {"Reject NUll"} else {"Fail to Reject Null"}
       ,Null_HO = toString('FFS = pHN')
       ,Alt_HA = toString('FFS < PHN')
       )

这是代码运行后的头部。

> head(new.df)
  cpt FFS_prop PHN_prop differnce results Null_HO Alt_HA
1   1  0.00168  0.00952  -0.00784       1       1      1
2   1  0.00033  0.00142  -0.00109       1       1      1
3   1  0.00239  0.01461  -0.01222       1       1      1
4   1  0.00135  0.00919  -0.00783       1       1      1
5   1  0.00008  0.00180  -0.00172       1       1      1
6   1  0.00036  0.00177  -0.00141       1       1      1

请朋友们,为什么我的字符串不能进入数据数据框?

我试图将as.character()放在它们周围,toString()在它们周围都是徒劳的。

更明智的请告知。

感谢。

1 个答案:

答案 0 :(得分:1)

您可以设置options(stringsAsFactors=F),也可以在循环中的data.frame中设置stringsAsFactors=F。问题是因为你在每个循环中构建一个新的data.frame,它不知道你在data.frame上设置的规则,它将在以后添加。因此,在创建时,它将其值转换为一个因子,该因子存储为每个观察到的字符串的唯一整数。由于您只添加一个值,因此每个因子都有一个级别,因此它们每个都编码为整数1。

然后,当您转到master data.frame时,该整数1将转换为字符“1”。因此str(new.df)应该显示您的字符列仍然是字符,它们恰好包含每行的字符“1”。

逐行构建data.frames始终是一个混乱的过程,如果可能的话应该避免。最好尝试逐列构建数据数据,然后在最后构建data.frame。你说out是在mapply上使用prop.test的结果,所以我创建了一个样本

out<-mapply(prop.test, replicate(10, rbinom(1, size = 100, prob = .5)), 100)

这相当于你的out只有10列我认为。但是你可以用

提取所有的p值
apply(out, 2, '[[', "p.value")

以及

的所有FSS值
apply(out, 2, function(x) x$estimate[[1]])

所以你的data.frame结构看起来更像是

new.df<- data.frame(cpt = fwa$proc
    ,FFS_prop=apply(out, 2, function(x) x$estimate[[1]])
    ,PHN_prop=apply(out, 2, function(x) x$estimate[[2]])
    ,pval = apply(out, 2, '[[', "p.value")
    ,Null_HO = 'FFS = pHN'
    ,Alt_HA = 'FFS < PHN'
    ,stringsAsFactors=F
)
new.df <- transform(new.df, 
    differnce=FFS_prop-PHN_prop,
    ,results=ifelse(pval<.05, "Reject NUll", "Fail to Reject Null")
)