2016-03-25 30 views
0

是否有任何无缺陷且更快的替代方案可用于循环代码?替代方案更多高效循环选项

for(i in 1:length(Mergedf)) 
{if (Mergedf[i,"z"]==0) 
{Mergedf[i,"cntry_origin"] <-Mergedf[i,"V2"]} 
    print(Mergedf[i,"cntry_origin"]) 
} 

mergdf如果结果是复杂的逻辑。

感谢

+1

'MergedDf [MergedDf $ z == 0,] $ cntry_origin < - MergedDf [MergedDf $ z == 0,] $ V2' – SymbolixAU

+0

谢谢...但是这个数据表?我对语法不熟悉......你能解释一下吗? – user1916067

+0

不,它的基础R - 请参阅我的回答 – SymbolixAU

回答

2

你正在试图做的是一个非常基本的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] 
+0

感谢您的回应。 – user1916067

+0

@ user1916067 - 如果这回答您的问题,您应该按'打勾'标记为完成 – SymbolixAU