r中的循环计算
我在执行迭代定义的计算时遇到困难。以下数据作为示例(实际数据集大得多): 比如说r中的循环计算,r,loops,dataframe,R,Loops,Dataframe,我在执行迭代定义的计算时遇到困难。以下数据作为示例(实际数据集大得多): 比如说 Individual P1 P2 relationA 1 A 0 0 1 2 B 0 0 0 3 C A B (A = 1 + B = 0)/2 = 0.5 4 D 0 0 0 5 E C D (C= 0.5 + D = 0
Individual P1 P2 relationA
1 A 0 0 1
2 B 0 0 0
3 C A B (A = 1 + B = 0)/2 = 0.5
4 D 0 0 0
5 E C D (C= 0.5 + D = 0)/2 = 0.25
6 F C E (C = 0.5 + E = 0.25)/2 = 0.375
预期输出如下所示:
Individual P1 P2 relationA
1 A 0 0 1
2 B 0 0 0
3 C A B 0.5
4 D 0 0 0
5 E C D 0.25
6 F C E 0.375
7 G 0 0 0
8 H1 E G 0.125
9 H2 E G 0.125
10 H3 E G 0.125
11 H4 E G 0.125
12 H5 E G 0.125
13 K1 H1 H1 0.125
14 K2 H2 H2 0.125
15 K3 H3 H3 0.125
16 K4 H4 H4 0.125
17 K5 H5 H5 0.125
我的困难在于在R
中以适当的方式表达这一点。任何帮助都将不胜感激 编辑:
更简洁地说,您可以使用sapply
和rowSums
将for循环
删除为一行代码:
# Initialize values of relationA
myd$relationA <- 0
myd$relationA[myd$Individual=="A"] <- 1
# Calculate relationA
myd$relationA <- myd$relationA + rowSums(sapply(myd$Individual, function(indiv)
myd$relationA[myd$Individual==indiv]/2 * ((myd$P1==indiv) + (myd$P2==indiv))))
您可以编写一个函数来计算给定个体和(隐式)关系的值,作为一个简单的递归函数
relationA <- function(ind) {
if(ind == "A") {
1
} else if (ind == "0") {
0
} else {
pts <- myd[myd$Individual == ind,]
(relationA(pts[["P1"]]) + relationA(pts[["P2"]])) / 2
}
}
但您可以相对轻松地将其矢量化到所有个人:
> sapply(myd$Individual, relationA)
A B C D E F G H1 H2 H3 H4 H5 K1
1.000 0.000 0.500 0.000 0.250 0.375 0.000 0.125 0.125 0.125 0.125 0.125 0.125
K2 K3 K4 K5
0.125 0.125 0.125 0.125
并且可以使用将其分配回myd
myd$relationA <- sapply(myd$Individual, relationA)
然后,您必须初始化缓存:
myd$relationA <- NA_real_
我想创建一个循环,可以在这样的大数据集中执行类似的计算。。。不幸的是,没有主意。我不确定我是否理解您要查找的内容,但您可能需要查看ifelse()和apply()函数。@screechOwl请查看我编辑的版本。无需对该问题进行否决表决。这是一个合理的问题。问题只是英语的一个方面。也许我们不必投反对票,而可以更努力地去理解一些问题,尽管这些问题可能措词不当,但仍然显示出真正的需要。@GSee最初的问题确实很难理解。但否决票向其他人表明,这个问题不值得浪费时间。语言障碍使它更难理解,但也不失为一个人的时间。谢谢,请查看我最近的编辑…当我尝试你建议我得到的循环时“在
$@sharnil中出错!我忘了复制和粘贴前两行。我现在用正确的行编辑了答案,还将变量名从values
更改为relationA
relationA <- function(ind) {
if(ind == "A") {
1
} else if (ind == "0") {
0
} else {
pts <- myd[myd$Individual == ind,]
(relationA(pts[["P1"]]) + relationA(pts[["P2"]])) / 2
}
}
> relationA("A")
[1] 1
> relationA("F")
[1] 0.375
> relationA("K5")
[1] 0.125
> sapply(myd$Individual, relationA)
A B C D E F G H1 H2 H3 H4 H5 K1
1.000 0.000 0.500 0.000 0.250 0.375 0.000 0.125 0.125 0.125 0.125 0.125 0.125
K2 K3 K4 K5
0.125 0.125 0.125 0.125
myd$relationA <- sapply(myd$Individual, relationA)
relationAc <- function(ind) {
pts <- myd[myd$Individual == ind,]
if(nrow(pts) == 0 | any(is.na(pts[["relationA"]]))) {
relationA <-
if(ind == "A") {
1
} else if (ind == "0") {
0
} else {
(relationAc(pts[["P1"]]) + relationAc(pts[["P2"]])) / 2
}
myd[myd$Individual == ind, "relationA"] <<- relationA
relationA
} else {
pts[["relationA"]]
}
}
myd$relationA <- NA_real_
> myd
Individual P1 P2 relationA
1 A 0 0 NA
2 B 0 0 NA
3 C A B NA
4 D 0 0 NA
5 E C D NA
6 F C E NA
7 G 0 0 NA
8 H1 E G NA
9 H2 E G NA
10 H3 E G NA
11 H4 E G NA
12 H5 E G NA
13 K1 H1 H1 NA
14 K2 H2 H2 NA
15 K3 H3 H3 NA
16 K4 H4 H4 NA
17 K5 H5 H5 NA
> relationAc("K5")
[1] 0.125
> myd
Individual P1 P2 relationA
1 A 0 0 1.000
2 B 0 0 0.000
3 C A B 0.500
4 D 0 0 0.000
5 E C D 0.250
6 F C E NA
7 G 0 0 0.000
8 H1 E G NA
9 H2 E G NA
10 H3 E G NA
11 H4 E G NA
12 H5 E G 0.125
13 K1 H1 H1 NA
14 K2 H2 H2 NA
15 K3 H3 H3 NA
16 K4 H4 H4 NA
17 K5 H5 H5 0.125
> sapply(myd$Individual, relationAc)
A B C D E F G H1 H2 H3 H4 H5 K1
1.000 0.000 0.500 0.000 0.250 0.375 0.000 0.125 0.125 0.125 0.125 0.125 0.125
K2 K3 K4 K5
0.125 0.125 0.125 0.125
> myd
Individual P1 P2 relationA
1 A 0 0 1.000
2 B 0 0 0.000
3 C A B 0.500
4 D 0 0 0.000
5 E C D 0.250
6 F C E 0.375
7 G 0 0 0.000
8 H1 E G 0.125
9 H2 E G 0.125
10 H3 E G 0.125
11 H4 E G 0.125
12 H5 E G 0.125
13 K1 H1 H1 0.125
14 K2 H2 H2 0.125
15 K3 H3 H3 0.125
16 K4 H4 H4 0.125
17 K5 H5 H5 0.125