将数据从两个for循环写入矩阵

时间:2013-12-10 20:48:35

标签: r loops for-loop

我有以下数据集:

data<-NULL
pA<-NULL
pB<-NULL
field<-c("A","A","A","A","B","B","B","B")
trt<-c("X","X","Y","Y")
patternA<-c("none","none","none","none","T","T","none",
"none","T","T","none","none","T","T","T","T")
patternB<-c("T","T","T","T","T","T","T","T","none","none","T","T","T","T","T","T")
df<-data.frame(field,trt,patternA,patternB)

现在我尝试做这样的事情:

for (i in unique(df$field)){
for (j in unique(trt))
{ pA[j]<-nrow(df[df$patternA=="T"&df$trt==j,])/nrow(df[df$trt==j,])
pB[j]<-nrow(df[df$patternB=="T"&df$trt==j,])/nrow(df[df$trt==j,])
}
fd<-i
 p<-cbind(fd,pA,pB)
 data<-rbind(data,p)
 }

获得类似的东西。这是我通过运行df by field的两个循环来实现的(首先是字段“A”,然后是字段“B”)

数据:

field pA  pB 
X "A"   "0.5" "0.5"
Y "A"   "0" "1"
X "B"   "1" "1"
Y "B"   "0.5" "1"

然而,R给了我类似的东西:

   fd  pA     pB    
X "A" "0.75" "0.75"
Y "A" "0.25" "1"   
X "B" "0.75" "0.75"
Y "B" "0.25" "1"  

这不是我想要的。我做错了什么?我想尽可能坚持使用循环方法,尽管我知道一些缺点。

1 个答案:

答案 0 :(得分:1)

您也可以尝试ddply

library(plyr)
ddply(df, .(trt, field), summarize,
  pA = sum(patternA == "T")/length(patternA),
  pB = sum(patternB == "T")/length(patternA))

#   trt field  pA  pB
# 1   X     A 0.5 0.5
# 2   X     B 1.0 1.0
# 3   Y     A 0.0 1.0
# 4   Y     B 0.5 1.0

另请注意,矩阵的组件应具有相同的模式。因此,当您将数字比例与字段&#39; field&#39;一起放入矩阵时,您的数字比例将被强制转换为字符。在这里,我创建了一个数据框,其中每列可以是不同的模式。