替代更高效的循环选项
Alternative More Efficient Loop options
是否有任何无错误且更快的 for 循环代码替代方案?
for(i in 1:length(Mergedf))
{if (Mergedf[i,"z"]==0)
{Mergedf[i,"cntry_origin"] <-Mergedf[i,"V2"]}
print(Mergedf[i,"cntry_origin"])
}
Mergdf 如果是复杂逻辑的结果。
谢谢
您尝试做的是一个非常基本的 R
'subset and replace' 问题。如果您习惯于使用 VBA
这样的语言编写代码,那么 for
循环似乎很自然。然而,R
"excels"(双关语)是将这些类型的操作向量化的能力,因此它一步完成,无需遍历整个数据集。
这里的代码全部写在Base R
考虑示例数据
set.seed(1)
MergedDF <- data.frame("z" = c(0,1,2,3,0,1,2,3),
"cntry_origin" = letters[1:8],
"V2" = rnorm(8,0,1),
stringsAsFactors = FALSE)
# z cntry_origin V2
# 1 0 a -0.6264538
# 2 1 b 0.1836433
# 3 2 c -0.8356286
# 4 3 d 1.5952808
# 5 0 e 0.3295078
# 6 1 f -0.8204684
# 7 2 g 0.4874291
# 8 3 h 0.7383247
针对给定条件过滤 data.frame
获取z == 0
的所有行
MergedDF[MergedDF$z == 0, ]
# z cntry_origin V2
# 1 0 a -0.6264538
# 5 0 e 0.3295078
选择特定列
要获取列 cntry_origin
中的所有值,其中 z==0
,有两个等效语句:
MergedDF[MergedDF$z == 0, "cntry_origin"]
# [1] "a" "e"
## Or
MergedDF[MergedDF$z == 0, ]$cntry_origin
# [1] "a" "e"
获取 V2
列的值,其中 z==0
MergedDF[MergedDF$z == 0, ]$V2
#[1] -0.6264538 0.3295078
用不同的值替换一列
要用 V2
替换列 cntry_origin
,其中 z==0
只是将一个分配给另一个的问题
MergedDF[MergedDF$z == 0, ]$cntry_origin <- MergedDF[MergedDF$z == 0, ]$V2
MergedDF
# z cntry_origin V2
# 1 0 -0.626453810742332 -0.6264538
# 2 1 b 0.1836433
# 3 2 c -0.8356286
# 4 3 d 1.5952808
# 5 0 0.329507771815361 0.3295078
# 6 1 f -0.8204684
# 7 2 g 0.4874291
# 8 3 h 0.7383247
等效的 data.table
代码为
library(data.table)
setDT(MergedDF)[z==0, cntry_origin := V2]
是否有任何无错误且更快的 for 循环代码替代方案?
for(i in 1:length(Mergedf))
{if (Mergedf[i,"z"]==0)
{Mergedf[i,"cntry_origin"] <-Mergedf[i,"V2"]}
print(Mergedf[i,"cntry_origin"])
}
Mergdf 如果是复杂逻辑的结果。
谢谢
您尝试做的是一个非常基本的 R
'subset and replace' 问题。如果您习惯于使用 VBA
这样的语言编写代码,那么 for
循环似乎很自然。然而,R
"excels"(双关语)是将这些类型的操作向量化的能力,因此它一步完成,无需遍历整个数据集。
这里的代码全部写在Base R
考虑示例数据
set.seed(1)
MergedDF <- data.frame("z" = c(0,1,2,3,0,1,2,3),
"cntry_origin" = letters[1:8],
"V2" = rnorm(8,0,1),
stringsAsFactors = FALSE)
# z cntry_origin V2
# 1 0 a -0.6264538
# 2 1 b 0.1836433
# 3 2 c -0.8356286
# 4 3 d 1.5952808
# 5 0 e 0.3295078
# 6 1 f -0.8204684
# 7 2 g 0.4874291
# 8 3 h 0.7383247
针对给定条件过滤 data.frame
获取z == 0
MergedDF[MergedDF$z == 0, ]
# z cntry_origin V2
# 1 0 a -0.6264538
# 5 0 e 0.3295078
选择特定列
要获取列 cntry_origin
中的所有值,其中 z==0
,有两个等效语句:
MergedDF[MergedDF$z == 0, "cntry_origin"]
# [1] "a" "e"
## Or
MergedDF[MergedDF$z == 0, ]$cntry_origin
# [1] "a" "e"
获取 V2
列的值,其中 z==0
MergedDF[MergedDF$z == 0, ]$V2
#[1] -0.6264538 0.3295078
用不同的值替换一列
要用 V2
替换列 cntry_origin
,其中 z==0
只是将一个分配给另一个的问题
MergedDF[MergedDF$z == 0, ]$cntry_origin <- MergedDF[MergedDF$z == 0, ]$V2
MergedDF
# z cntry_origin V2
# 1 0 -0.626453810742332 -0.6264538
# 2 1 b 0.1836433
# 3 2 c -0.8356286
# 4 3 d 1.5952808
# 5 0 0.329507771815361 0.3295078
# 6 1 f -0.8204684
# 7 2 g 0.4874291
# 8 3 h 0.7383247
等效的 data.table
代码为
library(data.table)
setDT(MergedDF)[z==0, cntry_origin := V2]