R:使用索引的嵌套循环不会覆盖数据框
R: Nested for loop using indices won't overwrite data frame
我有以下数据框:
ID<-seq(1:5) #patient ID
snp1<-c("A","T","A","A","T")
snp2<-c("C","C","0","C","C")
snp3<-c("A","G","A","A","G")
snp4<-c("T","0","C","G","T")
snp5<-c("G","G","G","G","A")
dat<-data.frame(ID,snp1,snp2,snp3,snp4,snp5)
print(dat)
给出:
ID snp1 snp2 snp3 snp4 snp5
1 1 A C A T G
2 2 T C G 0 G
3 3 A 0 A C G
4 4 A C A G G
5 5 T C G T A
我正在尝试使用嵌套的 for 循环来计算 dat 中每一列给定值的出现次数。首先,我创建了一个空数据框,其中列为 snps1-5,行指示每列在 dat:
中可以采用的可能值
results<- data.frame(matrix(0,ncol = 5, nrow = 5))
colnames(results)=c("snp1","snp2","snp3","snp4","snp5")
rownames(results)=c("A","T","C","G","0")
为了确保我想要合并到我的循环中的代码有效,我执行以下操作:
results["A","snp1"]<-nrow(subset(dat,subset= snp1=="A"))
print(results)
对于具有 A 三次的数据中的 snp1 正确给出 3:
snp1 snp2 snp3 snp4 snp5
A 3 0 0 0 0
T 0 0 0 0 0
C 0 0 0 0 0
G 0 0 0 0 0
0 0 0 0 0 0
然后我使用下面的嵌套 for 循环对每一列执行相同的操作(第一个 for 循环),但对 dat 中的列可以采用的每个可能值重复该过程(第二个 for 循环):
for(i in colnames(results)){for(j in c("A","T","C","G","0")){
snp<-as.name(i)
results[j,i]=nrow(subset(dat,subset= snp==j))
results
}}
print(results)
它给出了一个完全用 0 填充的数据框:
snp1 snp2 snp3 snp4 snp5
A 0 0 0 0 0
T 0 0 0 0 0
C 0 0 0 0 0
G 0 0 0 0 0
0 0 0 0 0 0
我在网上花了几个小时试图确定问题出在哪里,但我对解释一无所知。我最初希望根据添加到 dat 的表型列的值来执行此过程,以便我获得案例和控件的计数,但我无法通过这一点。任何建议将不胜感激。谢谢你。
在这样的循环中工作时,我更喜欢使用索引进行子集化。即把subset(dat,subset= snp==j)
改成dat[dat[, i] == j, ]
。希望对您有所帮助!
当然,对于这样的问题,您不必使用循环。你可以,
values <- c("A","T","C","G","0")
apply(dat[, -1], 2, function(x) sapply(values, function(y) length(which(x == y))))
编写一个函数,为一列做正确的事情,例如,
fun = function(x)
table(factor(x, levels = c("A", "C", "G", "T", "0")))
然后将其应用于所有列
apply(dat[,-1], 2, fun)
可能用NA
而不是0来表示缺失值要好得多;调整功能以在这种情况下工作
fun = function(x)
table(factor(x, levels = c("A", "C", "G", "T")), useNA = "always")
我有以下数据框:
ID<-seq(1:5) #patient ID
snp1<-c("A","T","A","A","T")
snp2<-c("C","C","0","C","C")
snp3<-c("A","G","A","A","G")
snp4<-c("T","0","C","G","T")
snp5<-c("G","G","G","G","A")
dat<-data.frame(ID,snp1,snp2,snp3,snp4,snp5)
print(dat)
给出:
ID snp1 snp2 snp3 snp4 snp5
1 1 A C A T G
2 2 T C G 0 G
3 3 A 0 A C G
4 4 A C A G G
5 5 T C G T A
我正在尝试使用嵌套的 for 循环来计算 dat 中每一列给定值的出现次数。首先,我创建了一个空数据框,其中列为 snps1-5,行指示每列在 dat:
中可以采用的可能值results<- data.frame(matrix(0,ncol = 5, nrow = 5))
colnames(results)=c("snp1","snp2","snp3","snp4","snp5")
rownames(results)=c("A","T","C","G","0")
为了确保我想要合并到我的循环中的代码有效,我执行以下操作:
results["A","snp1"]<-nrow(subset(dat,subset= snp1=="A"))
print(results)
对于具有 A 三次的数据中的 snp1 正确给出 3:
snp1 snp2 snp3 snp4 snp5
A 3 0 0 0 0
T 0 0 0 0 0
C 0 0 0 0 0
G 0 0 0 0 0
0 0 0 0 0 0
然后我使用下面的嵌套 for 循环对每一列执行相同的操作(第一个 for 循环),但对 dat 中的列可以采用的每个可能值重复该过程(第二个 for 循环):
for(i in colnames(results)){for(j in c("A","T","C","G","0")){
snp<-as.name(i)
results[j,i]=nrow(subset(dat,subset= snp==j))
results
}}
print(results)
它给出了一个完全用 0 填充的数据框:
snp1 snp2 snp3 snp4 snp5
A 0 0 0 0 0
T 0 0 0 0 0
C 0 0 0 0 0
G 0 0 0 0 0
0 0 0 0 0 0
我在网上花了几个小时试图确定问题出在哪里,但我对解释一无所知。我最初希望根据添加到 dat 的表型列的值来执行此过程,以便我获得案例和控件的计数,但我无法通过这一点。任何建议将不胜感激。谢谢你。
在这样的循环中工作时,我更喜欢使用索引进行子集化。即把subset(dat,subset= snp==j)
改成dat[dat[, i] == j, ]
。希望对您有所帮助!
当然,对于这样的问题,您不必使用循环。你可以,
values <- c("A","T","C","G","0")
apply(dat[, -1], 2, function(x) sapply(values, function(y) length(which(x == y))))
编写一个函数,为一列做正确的事情,例如,
fun = function(x)
table(factor(x, levels = c("A", "C", "G", "T", "0")))
然后将其应用于所有列
apply(dat[,-1], 2, fun)
可能用NA
而不是0来表示缺失值要好得多;调整功能以在这种情况下工作
fun = function(x)
table(factor(x, levels = c("A", "C", "G", "T")), useNA = "always")