【问题标题】:Alternative More Efficient Loop options替代更有效的循环选项
【发布时间】:2016-03-25 04:37:00
【问题描述】:

对于这个 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 如果是复杂逻辑的结果。

谢谢

【问题讨论】:

  • MergedDf[MergedDf$z == 0, ]$cntry_origin &lt;- MergedDf[MergedDf$z == 0, ]$V2
  • 谢谢...但是这是数据表吗?我不熟悉语法...你能解释一下吗?
  • 不,它是 Base R - 看我的回答

标签: r for-loop foreach apply


【解决方案1】:

您尝试做的是一个非常基本的R“子集和替换”问题。如果您习惯于使用像VBA 这样的语言编写代码,那么for 循环似乎很自然。然而,R“擅长”(双关语)的地方在于能够矢量化这些类型的操作,因此它可以一步完成,而无需遍历整个数据集。

这里的代码都是用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

用不同的值替换一列

要将cntry_origin 列替换为V2,其中z==0 只需将一个分配给另一个

MergedDF[MergedDF$z == 0, ]$cntry_origin <- MergedDF[MergedDF$z == 0, ]$V2

合并的DF

#   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]

【讨论】:

  • 感谢您的回复。
  • @user1916067 - 如果这回答了您的问题,您应该按“勾号”将其标记为完成
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-20
  • 2021-03-17
  • 1970-01-01
  • 2023-01-13
  • 1970-01-01
  • 2021-01-26
  • 1970-01-01
相关资源
最近更新 更多