我正在尝试从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()在它们周围都是徒劳的。
更明智的请告知。
感谢。
答案 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列我认为。但是你可以用
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")
)