是否有任何无缺陷且更快的替代方案可用于循环代码?替代方案更多高效循环选项
for(i in 1:length(Mergedf))
{if (Mergedf[i,"z"]==0)
{Mergedf[i,"cntry_origin"] <-Mergedf[i,"V2"]}
print(Mergedf[i,"cntry_origin"])
}
mergdf如果结果是复杂的逻辑。
感谢
是否有任何无缺陷且更快的替代方案可用于循环代码?替代方案更多高效循环选项
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
“子集并更换”的问题。如果您习惯于使用VBA
这样的语言编写,那么for
循环似乎很自然。然而,R
“擅长”(双关意图)是能够引导这些类型的操作,因此它可以一步完成,而不需要遍历整个数据集。
这里的代码全部写在基础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
列的值
更换一个co lumn不同的值
要使用V2
,其中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
的事情更换色谱柱cntry_origin
代码将是
library(data.table)
setDT(MergedDF)[z==0, cntry_origin := V2]
感谢您的回应。 – user1916067
@ user1916067 - 如果这回答您的问题,您应该按'打勾'标记为完成 – SymbolixAU
'MergedDf [MergedDf $ z == 0,] $ cntry_origin < - MergedDf [MergedDf $ z == 0,] $ V2' – SymbolixAU
谢谢...但是这个数据表?我对语法不熟悉......你能解释一下吗? – user1916067
不,它的基础R - 请参阅我的回答 – SymbolixAU