【问题标题】:Combining two loop into single with certain condition in R在R中将两个循环组合成具有特定条件的单个循环
【发布时间】:2021-02-28 21:59:56
【问题描述】:

使用以下x 向量,我想创建一个大小为6 (grt1) 的向量,具有两个条件。对于x 的唯一值,请使用下面的 sub。对于grt1的其他位置如3,5, and 6,数据来自std normal。

h=c(1:6)
grt1=numeric(length(h)) #Null vector
x=c(1,2,2,4,4,4)
for (i in unique(x)){
  f=rep(x[x==i],3)
  grt1[i]=sum(f)
} ##Condition-1
 for( j in c(3,5,6))
 {
   grt1[j]=rnorm(1) 
 } ##Condition 2

上面的代码正在运行。但我想通过不在第二个条件中指定 c(3,5,6) 来使它们成为一般性声明。

感谢任何帮助。

【问题讨论】:

    标签: r loops for-loop


    【解决方案1】:

    这是split的选项

    v1 <- sapply(split(x, x), function(x) sum(rep(x, 3)))
    grt1[grt1 == 0] <- rnorm(sum(grt1 == 0))
    grt1
    #[1]  3.0000000 12.0000000  0.3993774 36.0000000 -0.8149975 -1.2508617
    

    如果我们需要使用 OP 的循环,使用 which 获取 0 元素的索引(因为 'grt1' 被初始化为 0 的 numeric 向量),循环遍历它并用 @ 分配这些元素987654325@

    for(j in which(grt1 == 0))  grt1[j] <- rnorm(1)
    grt1
    #[1]  3.000000 12.000000 -0.765245 36.000000 -1.350172 -1.081518
    

    注意:rnormVectorized,所以这里不需要 for 循环


    或者tidyverse

    library(dplyr)
    library(tidyr)
    tibble(x) %>% 
       group_by(x) %>%
       summarise(Sum = sum(rep(x, 3)), .groups = 'drop') %>%
       complete(x = h) %>% 
       transmute(Sum = replace(Sum, is.na(Sum), rnorm(sum(is.na(Sum))))) %>%
       pull(Sum)
    #[1]  3.0000000 12.0000000 -1.9279778 36.0000000  0.7900143 -0.2506099
    

    【讨论】:

    • 有什么办法可以使用任何循环来完成吗?
    • @Uddin 我想您的问题是更改手册 3、5、6 对吗?更新后的代码就是这样做的
    【解决方案2】:

    which(duplicated(x)) 会给你c(3, 5, 6)。试试看:

    inds <- which(duplicated(x))
    
    for (i in unique(x)) {
      f=rep(x[x==i],3)
      grt1[i]=sum(f)
    } 
    for( j in inds){
      grt1[j]=rnorm(1) 
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-15
      • 2013-10-03
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多